Javascript 如何防止原型显示在阵列上

Javascript 如何防止原型显示在阵列上,javascript,arrays,prototype,Javascript,Arrays,Prototype,我想用我自己的一些函数扩展数组功能。这很好用。但是,我注意到,在控制台中,函数被附加到数组中,就好像它们是数据一样 小提琴: 下面是代码,因为stackoverflow迫使我发布只需单击小提琴: a = [1,2,3]; Array.prototype.doMagic = function(){ var returnvar = this; returnvar.push(42); return returnvar; } console.log(a); for (var

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

小提琴:

下面是代码,因为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。有没有办法不在数组中显示原型函数?

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

一种方法是使用:

更好的方法是:


对于现代浏览器来说,数组可能是一个复制品。在javascript中,数组也是一个对象。请参阅@RobinvanBaalen,但对于…in,在数组上迭代几乎总是错误的。@RobinvanBaalen:我知道这一点。我的意思是for..in与[object object]类型的对象一起使用,如果这样更清楚的话…@MattBall仍然是这样。我确实明白你的意思,埃尔克兰斯。只是在这样的数组/对象上迭代没有“错误”的方式。对于in可以做到这一点,但他需要像MattBall建议的那样在循环中进行object.hasOwnProperty检查。数组是对象,所以for..in也意味着数组。它用于枚举对象及其[[Prototype]]链的可枚举属性,没有特定顺序。如果需要迭代可枚举属性,则可以将其用于数组。然而,这通常不是必需的,因为顺序可能不是预期的,因此更常见的是使用普通for循环来保证访问数字成员的顺序。
for (var i=0; i<a.length; i++){
  console.log(a[i]);
}
a.forEach(function(val, i) {
  ...
});
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(Array.prototype, 'doMagic', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function(){
        var returnvar = this;
        returnvar.push(42);
        return returnvar;
    }
});