2013-08-29 56 views
3

JavaScript數組是否有可能添加屬性的JavaScript Array像長度不得到For IN循環遍歷,但對創造添加屬性類似於長度

每個實例不同的值下面的代碼:

a = new Array(); 
a.dimension = 2; //add a new property to array 

在這裏如果for in循環被用來迭代a,維度也將被迭代,我不想要。

可以添加這樣的屬性嗎?

回答

6

是的,這是可能的。使用defineProperty -

Object.defineProperty(a, "dimension", { 
    enumerable: false, 
    configurable: true, 
    writable: true, 
    value: 2 
}); 

這將創建一個名爲dimensiona,不會在for..in循環中枚舉屬性。

您可以定義一個函數來創建這樣的屬性 -

function defineArrayProperties(object, property, value) { 
    Object.defineProperty(object, property, { 
     enumerable: false, 
     configurable: true, 
     writable: true, 
     value: value 
    }); 
} 

,然後你可以這樣調用 -

var b = []; 
defineArrayProperties(b, "dimension", 3); 

,您還可以在Array原型創建此功能,讓所有陣列對象默認繼承它 -

Array.prototype.defineProperty = function (property, value) { 
    Object.defineProperty(this, property, { 
     enumerable: false, 
     configurable: true, 
     writable: true, 
     value: value 
    }); 
}; 

var b = []; 
b.defineProperty("dimension", 4); 
alert(b.dimension); // will alert 4 

A Live Fiddle在這裏展示了上述兩種方法。我創建了兩個數組對象,並使用for ... in枚舉了它們的所有屬性。請注意,dimension不會顯示在任何for ... in中。

編輯

您的瀏覽器必須支持的ECMAScript 5爲了Object.defineProperty正常工作。

+0

失敗in for循環中,我仍然得到維迭代var arr = new Array(); \t \t Object.defineProperty(ARR, 「維」,{ 枚舉:假, 配置的:真, 可寫:真, 值:2 \t});對於(一個在ARR){console.log(一);}//打印尺寸 – Sandeep

+1

我的壞...已添加_DIM原型某處在我的代碼導致這...固定,它工作正常..謝謝很多 – Sandeep