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));
});
});