Почему не стоит переопределять и расширять встроенные прототипы?
Объекты и прототипы
Расширение встроенных прототипов (Array.prototype, Object.prototype, String.prototype) называют monkey patching. Оно меняет поведение всех объектов в приложении и в подключённых библиотеках, поэтому считается плохой практикой.
Пример
Array.prototype.last = function () {
return this[this.length - 1];
};
[1, 2, 3].last(); // 3Работает, но создаёт скрытую зависимость для всего кода.
Почему это опасно
- Конфликты имён: если стандарт или библиотека добавит метод с тем же именем, поведение изменится или сломается. Из-за такого конфликта с библиотекой MooTools стандарту пришлось назвать методы
flatвместоflattenиincludesвместоcontains. - Перечисляемые свойства: добавленное через присваивание свойство попадает в
for...in:
Object.prototype.extra = 1;
for (const key in { a: 1 }) console.log(key); // a, extra- Непредсказуемость библиотек: сторонний код ожидает стандартное поведение встроенных типов.
- Сложность отладки: поведение объекта нельзя понять по его определению.
Что делать вместо
- Написать обычную функцию-утилиту:
last(array). - Создать собственный класс-наследник или обёртку.
- Если нужен полифил, добавлять его только для реального стандартного API и через
Object.definePropertyсenumerable: false.
Коротко для собеседования
Встроенные прототипы общие для всего кода: изменение вызывает конфликты имён, ломает for...in и библиотеки. Вместо этого пишут утилиты или обёртки, а полифилы — только для стандартных API и неперечисляемыми.