3

是否可以向 javascript 添加属性,Array例如不会在For IN循环中迭代的长度,但对于创建的每个实例具有不同的值

以下代码:

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

在这里,如果for in使用循环进行迭代a,维度也将被迭代,这是我不想要的。

这可以添加这样的属性吗?

4

1 回答 1

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正常工作。

于 2013-08-29T06:32:59.533 回答