为什么要创建自定义prototype
功能,例如:
Array.prototype.clone = function(){
return JSON.parse(JSON.stringify(this));
}
在迭代for
循环时使它们可见?
很明显我的array
里面有arrays
,但由于某种原因,它在循环内部时会考虑我的所有自定义函数。为什么?我该如何预防?
OBS:我正在申请某种javascript竞赛,它采用我的算法并与其他玩家对战。此循环位于运行器内部,因此请注意,更改迭代处理方式不是一种选择。
这会破坏跑步者,因为它试图执行一些代码,认为我的自定义函数包含在列中。
但是,看看他们的代码,我注意到可以防止这种情况发生,因为他们也编辑/创建Array.prototype
函数。
答案 0 :(得分:1)
不要使用for...in
循环迭代数组。 for...in
循环枚举对象的所有属性,并且由于您的新原型函数是可枚举的,因此它也将被列出。避免这种情况的方法是使用array.hasOwnProperty
,但是为什么在使用常规for
循环正确迭代数组时呢?它会更快并且使用更少的代码:
for (var i = 0; i < this.matrix.length; i++) {
...
}
要在枚举对象的属性时不显示新功能,您需要使其不可枚举:
Object.defineProperty(Array.prototype, 'clone', {
enumerable: false,
value: function(obj) {
return JSON.parse(JSON.stringify(obj));
}
});