0

我想用我自己的一些功能来扩展 Array 的功能。这工作正常。但是,我注意到在控制台中,函数被“附加”到数组中,就好像它们是数据一样。

小提琴:http: //jsfiddle.net/BxfCy/1/

这是代码,因为 stackoverflow 迫使我发布(只需单击小提琴):

a = [1,2,3];

Array.prototype.doMagic = function(){
    var returnvar = this;
    returnvar.push(42);
    return returnvar;
}

console.log(a);

for (var n in a){
    console.log(a[n]);
}

我的想法是数组中没有显示其他数组函数(你知道,比如 push)。有没有办法不在数组中显示原型函数?

4

2 回答 2

5

一种方法是使用Object.hasOwnProperty()

for (var n in a){
    if (a.hasOwnProperty(n)) {
        console.log(a[n]);
    }
}

更好的方法是对数组使用正确的迭代习语

for (var i=0; i<a.length; i++){
    console.log(a[i]);
}

或用于Object.defineProperty使doMagic属性不可枚举

Object.defineProperty(Array.prototype, 'doMagic', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function(){
        var returnvar = this;
        returnvar.push(42);
        return returnvar;
    }
});
于 2013-02-21T01:18:35.267 回答
4

问题是您正在使用for..in循环,而您应该使用常规for循环。

for (var i=0; i<a.length; i++){
  console.log(a[i]);
}

for..in用于对象而不是数组。

编辑:在现代浏览器中,您也可以使用forEach

a.forEach(function(val, i) {
  ...
});
于 2013-02-21T01:18:13.810 回答