我将以下函数添加到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]
正在返回我的自定义函数(除了实际值,在我的情况下是目录名称)。
最佳解决方案是什么?
答案 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依赖关系中的代码首先不是很干净。