PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Почему не стоит переопределять и расширять встроенные прототипы?

Объекты и прототипы

Расширение встроенных прототипов (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 и неперечисляемыми.

Другие вопросы раздела