如何防止自定义方法出现在For循环中?

时间:2016-10-11 19:23:45

标签: javascript inheritance ecmascript-6 prototype

我将以下函数添加到Array类

Array.prototype.last = function(){
     return this[this.length-1];
 }

Array.prototype.first = function(){
     return this[0];
 }

我在Node项目中添加了一个名为Cosign的库。我无法控制它,它做了类似的事情:

for(var k in array) alert(array[k].charAt(0))

但是charAt是一个String方法。我相信array[k]正在返回我的自定义函数(除了实际值,在我的情况下是目录名称)。

最佳解决方案是什么?

2 个答案:

答案 0 :(得分:0)

Javascript代码永远不应该使用:

迭代数组
for (var k in array)

因为这种类型的迭代迭代了数组对象的所有可枚举属性,包括第三方库可以枚举的东西(该库上的耻辱)。它不会迭代数组元素。如果你使用的代码做得那么糟糕,那么我会非常关心代码的质量。

要迭代数组元素,代码应使用以下其中一个:

for (var k = 0; k < array.length; k++)

array.forEach(fn)

或者在ES6中:

for (var item of array)

如果您尝试向Array原型添加新方法,并且希望它们不能用于for (x in y)循环,那么您需要使用{{}将它们添加为不可枚举的1}}或Object.defineProperty()。以这种方式定义它们时,Object.defineProperties()默认为enumerable,并且它们不会被false循环拾取。

for/in

答案 1 :(得分:0)

所以我们都同意extending native prototypes can be a bad thing,我可以继续回答:默认情况下,对象属性赋值(使用=符号)会使您的属性enumerable: true。我们可以通过使用ES5的Object.defineProperties来指定我们的自定义方法来解决这个问题:

Object.defineProperties(Array.prototype, {
  last: { value: function(){ return this[this.length-1]; }},
  first: { value: function(){ return this[0]; }}
  // enumerable: false by default in Object.defineProperties
});

现在使用for in循环时,方法将不再出现。但是,NodeJS依赖关系中的代码首先不是很干净。