javascript - 自定义对象原型方法在数组循环中变为索引

时间:2014-09-29 08:28:19

标签: javascript

这是奇怪的事情。我为object定义了一个名为getSize的自定义原型方法:

if (!Object.prototype.getSize) {
    Object.prototype.getSize = function() {
        var size = 0, key;
        for (key in this) {
            if (this.hasOwnProperty(key)) size++;
        }
        return size;
    };
}

它为您提供对象的大小。到目前为止很简单吧? 这是我感到困惑的地方:

var l = ["foo", "bar"]
for (var i in l) {
    console.log(i);
}

结果是:

0
1
getSize

为什么getSize还有

修改的 我知道javascript中的数组也是对象。我的问题是为什么方法变成了索引,而不是保留方法。这对我没有任何意义......

2 个答案:

答案 0 :(得分:4)

因为getSize是一个可枚举的属性,你可以将它定义为不可枚举:

Object.defineProperty(Object.prototype, 'getSize', {
  enumerable: false,
  value: function() {
    var size = 0, key;
    for (key in this) {
      if (this.hasOwnProperty(key)) size++;
    }
    return size;
  }
});

但你也可以这样做:

Object.keys(object).length;

答案 1 :(得分:3)

因为["foo", "bar"]也是JavaScript中的对象。尝试在控制台中运行typeof ["foo", "bar"]。它会向您返回"object"。所以你也扩展了Arrays方法。完成此操作后,您还需要在所有hasOwnProperty次迭代中检查for..in

这适用于JavaScript中的所有global objects