我正在一个大型遗留代码库中工作,刚刚意识到有人这样做了:
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/