javascript - 为什么在 javascript 中向数组原型(prototype)添加方法会中断 for 循环的迭代?

标签 javascript arrays prototype

我正在一个大型遗留代码库中工作,刚刚意识到有人这样做了:

Array.prototype.insertAt = function (i,el){ return this.splice(i,0,el); }
Array.prototype.deleteAt = function (i){return this.splice(i, 1); }

这就是我不能这样做的原因:

var derp = new Array();
derp.push('duh');
derp.push('what?');

for (var i in derp) {
    console.log(derp[i]);
}

嗯,并不是我做不到,而是如果我做到了,我会得到意想不到的结果。那不是得到两行输出(“duh”和“什么?”),而是得到四行。最后两个是上面列出的两个函数。

我不想删除原始的原型(prototype)函数(因为天知道它们依赖什么),但我想知道是否有一种方法可以防止 for 循环循环添加的函数。

最佳答案

方法 1:使用常规 for(最受支持)

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

方法2:使用hasOwnProperty

for(var i in arr){
 if(arr.hasOwnProperty(i)){
     console.log(i)
  }
}

方法3:使用Object.defineProperty:

Object.defineProperty(Array.prototype, 'insertAt', {
    writeable: true,
    enumerable: false,
    value: Array.prototype.insertAt
})
Object.defineProperty(Array.prototype, 'deleteAt', {
    writeable: true,
    enumerable: false,
    value: Array.prototype.deleteAt
})

for(var i in derp){
    console.log(derp[i])
}

您使用哪一个取决于您的浏览器支持,最后一个可以防止更改所有编写的代码

关于javascript - 为什么在 javascript 中向数组原型(prototype)添加方法会中断 for 循环的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089705/

相关文章:

javascript - 有没有对此进行修改可以使表单值出现?

javascript - jquery 句柄和轨道样式

javascript - Node typescript 缺少构造签名(新缓冲区)

从文本文件创建数组并用 C 对其进行组织

c - 求数组 C 中数字的总和

javascript - 在 JavaScript 中,如何使用单个 ".prototype" block 从子类中继承父类?

c++ - V8引擎中的隐藏类是如何实现的?

JavaScript——提交值后清除表单

javascript - 删除对象 JS 中的节点

javascript - 如何覆盖原型(prototype)中的事件监听器?