2015-09-25 22 views
0

为什么创建自定义prototype功能,如:为什么通过数组迭代将我的自定义原型函数显示为项目?

Array.prototype.clone = function(){ 
    return JSON.parse(JSON.stringify(this)); 
} 

迭代一个for循环时,让他们看到?

例如: enter image description here

很明显,我有一个内,但由于某种原因,它在循环中时,考虑我所有的自定义功能。为什么?我怎样才能防止它?

OBS:我正在申请某种形式的JavaScript比赛,这需要我的算法并与其他玩家对战。这个循环在runner内部,所以请考虑改变迭代处理的方式不是一种选择。

这是打破跑步者,因为它试图执行一些代码与列以为我的自定义功能都包含在其中。

但是,看着他们的代码,我注意到有可能防止这种情况发生,因为他们还编辑/创建了Array.prototype函数。

+0

考虑使用http:// jsfiddle.net/提供重现问题所需的最低代码。 – HopefullyHelpful

+0

可能重复[Javascript:隐藏原型方法for循环?](http://stackoverflow.com/questions/1107681/javascript-hiding-prototype-methods-in-for-loop) –

+0

@LJᛃ我理解相似性,但我不认为它是重复的,因为我不想改变循环(正如我对问题所说的,我不能)。即使在这种情况下,我想要隐藏自定义函数。 –

回答

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)); 
    } 
}); 
+0

我明白了,但正如我所说,我没有控制他们使用的代码。在他们的**亚军**里面有一个'for ... in'循环,我的代码正在打破它。 –

+0

@PatrickBard:然后或者不要修改原型,或者将你的函数标记为不可枚举。我会和前者一起去的。 – Blender

相关问题