Ответ 1
Наивным способом было бы это сделать, если вы протестировали Chrome:
NodeList.prototype.forEach = Array.prototype.forEach;
Это работает. На Webkit. Однако он не работает в Firefox. Поскольку FF возвращает HTMLCollection...
Самый кросс-браузерный способ, который я нашел:
NodeList.prototype.forEach = HTMLCollection.prototype.forEach = Array.prototype.forEach;
Это не работает на IE8 и ниже, потому что они задыхаются при добавлении свойств в прототипы объектов хоста.
Полный список:
NodeList.prototype.forEach = HTMLCollection.prototype.forEach = Array.prototype.forEach;
NodeList.prototype.map = HTMLCollection.prototype.map = Array.prototype.map;
NodeList.prototype.filter = HTMLCollection.prototype.filter = Array.prototype.filter;
NodeList.prototype.reduce = HTMLCollection.prototype.reduce = Array.prototype.reduce;
NodeList.prototype.reduceRight = HTMLCollection.prototype.reduceRight = Array.prototype.reduceRight;
NodeList.prototype.every = HTMLCollection.prototype.every = Array.prototype.every;
NodeList.prototype.some = HTMLCollection.prototype.some = Array.prototype.some;
Или, чтобы порадовать нашего дорогого Берги (а также потому, что он чище):
['forEach', 'map', 'filter', 'reduce', 'reduceRight', 'every', 'some'].forEach(
function(p) {
NodeList.prototype[p] = HTMLCollection.prototype[p] = Array.prototype[p];
});
Учитывая связь с перфекционистами, в основном это не имеет никакого отношения. Проблема в том, что DOM в большинстве случаев не работает в браузерах при расширении. Эта модификация работоспособна во всех браузерах, за исключением IE <= 8.