非常了解这种方法:
[].prototype.forEach.call(aNodeList, function(node){
// manipulate node
});
因此,在forEach
方法中,this
将指向一个数组(在本例中是一个NodeList)。所以你可以在类似数组的NodeList上使用Array方法。
我明白这一点,但我有点困惑的是这实际上是如何运作的?即。为什么我不能aNodeList.forEach()
但我可以在Array原型上调用forEach
并且它可以工作?数组方法如何处理类似数组的对象?
这个问题实际上可能没有客观的答案,只是非常好奇。
答案 0 :(得分:6)
forEach
的原生实现是这样的(虽然这大大简化了):
Array.prototype.forEach = function(f) {
for (var i = 0; i < this.length; i++) {
f(this[i]);
};
};
但是,NodeList
可以通过相同的方式循环!因此,如果您在Array
上致电forEach
的{{1}},它的行为方式会相同。
事实上,我甚至可以创建自己的类似数组的对象,并在其上使用NodeList
的{{1}}!
Array
至于为什么forEach
上没有> Array.prototype.forEach.call({length: 3, '0': 'zero', '1': 'one', '2': 'two'}, function(x){ console.log(x); });
zero
one
two
,这是因为it doesn't extend Array
's prototype。
那么为什么forEach
没有自己的NodeList
实现呢?好吧,答案基本归结为“因为制作JavaScript实现的人没有制作一个。”