prototype與expando屬性的遍歷

 JS的對象(不僅是Object)能夠像html元素對象同樣,添加任意的自定義屬性值。也就是說JS的對象,天生都是Key/Value ,在遍歷屬性時,expando導入屬性和prototype導入屬性存在了混淆。html

 

js的prototype特性對對象的擴充很是的方便,因此咱們在製做一些jst類庫的時候,通常都會使用prototype特性爲對象添加方法,好比咱們對Object進行以下prototype擴充:ide

Object.prototype.GetValue=function(){}spa

Object.prototype.Method=function(){}prototype

Object.prototype.QequestData=function(){}htm

這個時候若是再使用Object做爲items結構來使用,咱們就會遇到遍歷這個items的錯誤,看下面的代碼:對象

var objItems = {};blog

objItems["1"] = "1111";get

objItems["2"] = "2222";it

objItems["3"] = "3333";io

遍歷這個集合:

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 values = [];

var obj = new items.constructor();

for (var key in items) {

if (obj[key] != items[key]) {

values.push(items[key]);

}

}

return values;

};

遍歷結果以下圖:

 

$(document).ready(function () {

$("#btn1").click(function () {

alert(DisplayItems(objItems));

});

$("#btn2").click(function () {

alert(GetExpandAttr(objItems));

});

});

相關文章
相關標籤/搜索