NodeList.prototype.forEach = Array.prototype.forEach; - программирование
Подтвердить что ты не робот

NodeList.prototype.forEach = Array.prototype.forEach;

Вы видите проблемы со следующим:

NodeList.prototype.forEach = Array.prototype.forEach;

Обычно forEach является просто свойством массивов, но, устанавливая его как свойство для всех NodeList, нет необходимости преобразовывать NodeList в массив, прежде чем вы сможете прокручивать его узлы с помощью forEach.

4b9b3361

Ответ 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);
};