Почему нельзя вешать на Array.prototype дополнительный обработчик или функцию

Ответ

Добавление методов в Array.prototype может привести к неожиданным побочным эффектам:

  1. Конфликты имен: если в будущем в стандарт добавится метод с таким же именем, поведение сломается.
  2. Итерации: добавленные свойства будут видны в for..in (хотя для массивов for..in не рекомендуется).
  3. Совместимость: код может сломаться в других библиотеках или фреймворках.

Лучше использовать отдельные утилиты или классы-обертки.

Пример проблемы:

Array.prototype.sum = function() { 
  return this.reduce((a, b) => a + b, 0); 
};

const arr = [1, 2, 3];
for (const key in arr) { 
  console.log(key); // Выведет: 0, 1, 2, "sum" 
}

Решение:

function sum(array) {
  return array.reduce((a, b) => a + b, 0);
}

Ответ 18+ 🔞

О, слушай, вот это тема, про которую я могу с пеной у рта рассказывать! Ну ты представляешь, сидит такой умник и думает: "А что, если я, блядь, в сам массив, в его прототип, свой метод запилю? Ну там, sum() какой-нибудь, чтобы красиво было: [1,2,3].sum()? Ёпта, гениально же!"

А на деле — это чистой воды пиздопроебибна, которая аукнется так, что мало не покажется. Сейчас разжую, почему.

Во-первых, конфликты имён, ёбта! Ты сегодня запилил свой милый Array.prototype.puperCalc. А завтра выходит новая версия JavaScript, и в ней уже есть нативный метод с таким же именем, но работает он по-другому. И всё, твой код, который пять лет работал, накрывается медным тазом. Сам от себя охуеешь, когда начнёшь искать, почему.

Во-вторых, итерации, сука! Ты же знаешь, что по массивам иногда (хотя и не нужно) циклом for..in ходят? Так вот, твой новый метод будет там светиться, как ёлочная игрушка!

Смотри, какой пиздец:

Array.prototype.sum = function() { 
  return this.reduce((a, b) => a + b, 0); 
};

const arr = [1, 2, 3];
for (const key in arr) { 
  console.log(key); // Выведет: 0, 1, 2, "sum" 
}

Видал? Вылезла наша "сумма"! Это ж хитрая жопа, которая в самый неожиданный момент может всё сломать.

И в-третьих, совместимость, блядь! Твой код попадёт в проект, где уже какая-нибудь левая библиотека два года назад засунула в прототип массива свой sum, но он возвращает строку, а не число. И пошла писать губерния, пидары налетели со своими багами, а виноват будешь ты.

Так что делать-то, спросишь? Да всё просто, как три копейки! Не лезь ты в глобальное говно, сделай обычную функцию и не парься!

function sum(array) {
  return array.reduce((a, b) => a + b, 0);
}

Вот и всё! Вызываешь sum([1,2,3]) и спишь спокойно. Никаких конфликтов, никаких сюрпризов в циклах. Волнение ебать — ноль. Терпения ноль ебать на поиски дурацких багов — тоже ноль.

Запомни, чувак: доверия к глобальным модификациям — ебать ноль. Не будь тем самым Герасимом, который топит всю экосистему ради одной своей Муму.