Ответ
Добавление методов в Array.prototype может привести к неожиданным побочным эффектам:
- Конфликты имен: если в будущем в стандарт добавится метод с таким же именем, поведение сломается.
- Итерации: добавленные свойства будут видны в
for..in(хотя для массивов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"
}
Решение:
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]) и спишь спокойно. Никаких конфликтов, никаких сюрпризов в циклах. Волнение ебать — ноль. Терпения ноль ебать на поиски дурацких багов — тоже ноль.
Запомни, чувак: доверия к глобальным модификациям — ебать ноль. Не будь тем самым Герасимом, который топит всю экосистему ради одной своей Муму.