是否可以向 javascript 添加属性,Array
例如不会在For IN
循环中迭代的长度,但对于创建的每个实例具有不同的值
以下代码:
a = new Array();
a.dimension = 2; //add a new property to array
在这里,如果for in
使用循环进行迭代a
,维度也将被迭代,这是我不想要的。
这可以添加这样的属性吗?
是否可以向 javascript 添加属性,Array
例如不会在For IN
循环中迭代的长度,但对于创建的每个实例具有不同的值
以下代码:
a = new Array();
a.dimension = 2; //add a new property to array
在这里,如果for in
使用循环进行迭代a
,维度也将被迭代,这是我不想要的。
这可以添加这样的属性吗?
是的,这是可能的。使用defineProperty -
Object.defineProperty(a, "dimension", {
enumerable: false,
configurable: true,
writable: true,
value: 2
});
这将创建一个调用的属性dimension
,a
不会在 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
正常工作。