天天看點

prototype與expando屬性的周遊

 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與expando屬性的周遊

由于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]);

周遊結果如下圖:

prototype與expando屬性的周遊

$(document).ready(function () {

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

alert(DisplayItems(objItems));

});

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

alert(GetExpandAttr(objItems));