Проверяет понимание опасностей модификации встроенных прототипов JavaScript и их влияния на совместимость и предсказуемость кода.
В JavaScript встроенные объекты, такие как Array, Object, String, имеют общие прототипы, доступные всему коду в текущем окружении. Если добавить или переопределить метод в Array.prototype, это увидят все массивы во всех модулях, включая сторонние библиотеки. Такое вмешательство называется monkey patching и почти всегда приводит к неожиданным последствиям.
for...in, что ломает чужой код.// Плохо: добавление метода в прототип
Array.prototype.last = function() {
return this[this.length - 1];
};
// Теперь любой for...in по массиву покажет 'last'
const arr = [1, 2, 3];
for (const key in arr) {
console.log(key); // 0, 1, 2, last
}
// Сторонняя библиотека может ожидать чистый прототип
// и сломаться из-за лишнего enumerable-свойства
Вместо изменения прототипа используйте отдельные утилиты или локальные функции. Если нужен полифил для старого окружения, применяйте Object.defineProperty с enumerable: false и тщательно проверяйте отсутствие метода.
// Хорошо: утилита без вмешательства в прототип
function last(arr) {
return arr[arr.length - 1];
}
// Полифил с невидимым свойством
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, 'includes', {
value: function(search) {
return this.indexOf(search) !== -1;
},
enumerable: false
});
}
Итог: переопределять встроенные прототипы стоит только в крайних случаях, например для полифилов с корректной настройкой дескрипторов. В обычном коде безопаснее использовать отдельные функции или утилитарные библиотеки, чтобы не влиять на глобальное окружение.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию