forEach如何实际工作在NodeList上

时间:2013-12-11 13:47:26

标签: javascript

非常了解这种方法:

[].prototype.forEach.call(aNodeList, function(node){
     // manipulate node
});

因此,在forEach方法中,this将指向一个数组(在本例中是一个NodeList)。所以你可以在类似数组的NodeList上使用Array方法。

我明白这一点,但我有点困惑的是这实际上是如何运作的?即。为什么我不能aNodeList.forEach()但我可以在Array原型上调用forEach并且它可以工作?数组方法如何处理类似数组的对象?

这个问题实际上可能没有客观的答案,只是非常好奇。

1 个答案:

答案 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实现的人没有制作一个。”