Array.prototype.foo1 = function(){console.log('this-is-in-prototype')}
var a = [];
a.foo2 = function(){console.log('this-is-in-obj')};
a.push(100);
a.push(200);
for (var k in a) {
console.log(k + ' : ' + a[k]);
}
上面这段代码,输出是这样的:
0 : 100
1 : 200
foo2 : function (){console.log('this-is-in-obj')}
foo1 : function (){console.log('this-is-in-prototype')}
这里不仅输入了数组的内容,也输出了我们自己加上去的方法。那么bug就来了:如果我们用 for (var key in array){} 这种形式遍历数组,就会把foo1、foo2也遍历出来,这显然不是我们想要的。
上面的代码中,a.foo2 = function(){} 这个地方的影响仅限于a本身。但Array.prototype.foo1会影响所有的Array。所以,如果一定要增加方法的话,用a.foo2 = function(){}这种形式可以缩小上面那个问题的影响范围。
另外,对Array的遍历,用a.forEach(function(item, index, thisArray) {...}),或者 for(var n=0; n<a.length; ++n) {...}都不会出现上面那个问题。所以,数组的遍历,推荐用这两种方式。