JS的對象(不隻是Object)可以像html元素對象一樣,添加任意的自定義屬性值。也就是說JS的對象,天生都是Key/Value ,在周遊屬性時,expando導入屬性和prototype導入屬性存在了混淆。
js的prototype特性對對象的擴充非常的友善,是以我們在制作一些jst類庫的時候,一般都會使用prototype特性為對象添加方法,比如我們對Object進行如下prototype擴充:
Object.prototype.GetValue=function(){}
Object.prototype.Method=function(){}
Object.prototype.QequestData=function(){}
這個時候如果再使用Object作為items結構來使用,我們就會遇到周遊這個items的錯誤,看下面的代碼:
var objItems = {};
objItems["1"] = "1111";
objItems["2"] = "2222";
objItems["3"] = "3333";
周遊這個集合:
function DisplayItems(obj) {
var values = [];
for (var key in obj) {
values.push(obj[key]);
}
return values;
};
擷取值如下圖:
由于prototype屬性的優先級很高,在對象執行個體生成的時候就expand到對象執行個體中去了。是以我們建立的任何一個對象,都會包含相同的prototype屬性。這樣一來就好辦了,我們把objItems中的prototype屬性找出來過濾掉就行了呗。參考代碼如下
function GetExpandAttr(items) {
var obj = new items.constructor();
for (var key in items) {
if (obj[key] != items[key]) {
values.push(items[key]);
周遊結果如下圖:
$(document).ready(function () {
$("#btn1").click(function () {
alert(DisplayItems(objItems));
});
$("#btn2").click(function () {
alert(GetExpandAttr(objItems));