NodeList.prototype.forEach = Array.prototype.forEach;
Вы видите проблемы со следующим:
NodeList.prototype.forEach = Array.prototype.forEach;
Обычно forEach
является просто свойством массивов, но, устанавливая его как свойство для всех NodeList
, нет необходимости преобразовывать NodeList
в массив, прежде чем вы сможете прокручивать его узлы с помощью forEach
.
Ответы
Ответ 1
Часто не рекомендуется расширять функциональность DOM через прототипы, особенно в более старых версиях IE (статья).
Однако вы можете просто использовать Array.prototype.forEach
даже без добавления его в цепочку прототипов или преобразования вашего NodeList
в массив:
var list = document.querySelectorAll(".some.query");
Array.prototype.forEach.call(list, function(el){ /* ... */ });
/* or */
var forEach = function(ctn, callback){
return Array.prototype.forEach.call(ctn, callback);
}
forEach(list, function(el){ /* ... */ });
См. также MDN: Почему я не могу использовать forEach
или map
на NodeList
.
Ответ 2
Если вы работаете над библиотекой, которая будет использоваться другими людьми, тогда это не очень хорошая идея.
Если это только ваш собственный код (например, веб-сайт), то я думаю, это не имеет большого значения. Вы должны, вероятно, защищать его, потому что в будущем браузеры будут поддерживать NodeList.prototype.forEach
изначально (Chrome уже делает это).
if (!NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
Ответ 3
Как упоминал Зета, было бы лучше использовать функцию удобства. Эта версия, однако, позволит вам дать контекст.
var forEach = function(list, callback, context){
return Array.prototype.forEach.call(list, callback, context);
};