no-extend-native
Запрещает расширять встроенные типы
В JavaScript можно расширить любой объект, включая встроенные, или «нативные» объекты. Иногда поведение этих нативных объектов изменяют так, что это нарушает предположения, сделанные о них в других частях кода.
Например, здесь мы переопределяем встроенный метод, что повлияет на все объекты, даже на другие встроенные объекты.
// seems harmless
Object.prototype.extra = 55;
// loop through some userIds
const users = {
"123": "Stan",
"456": "David"
};
// not what you'd expect
for (const id in users) {
console.log(id); // "123", "456", "extra"
}
Обычно для решения этой проблемы предлагают обернуть содержимое цикла for в users.hasOwnProperty(id). Однако если это правило строго соблюдается во всей кодовой базе, делать это не потребуется.
Описание правила
Запрещает напрямую изменять прототип встроенных объектов.
Примеры кода, нарушающего это правило:
/*eslint no-extend-native: "error"*/
;
;
Параметры
Это правило принимает параметр exceptions, который позволяет указать список встроенных объектов, расширение которых будет разрешено.
exceptions
Примеры кода, соответствующего правилу при использовании примера параметра { "exceptions": ["Object"] }:
/*eslint no-extend-native: ["error", { "exceptions": ["Object"] }]*/
Object.prototype.a = "a";
Известные ограничения
Это правило не сообщает о следующих менее очевидных способах изменения прототипа встроенных объектов:
const x = Object;
x.prototype.thing = a;
eval("Array.prototype.forEach = 'muhahaha'");
with(Array) {
prototype.thing = 'thing';
};
window.Function.prototype.bind = 'tight';
Когда не следует использовать это правило
Возможно, это правило стоит отключить при работе с полифилами, которые пытаются обновить старые версии JavaScript в соответствии с последней спецификацией, например с теми, которые могут Function.prototype.bind или Array.prototype.forEach способом, совместимым с будущими версиями.
Связанные правила
Версия
Это правило появилось в ESLint v0.1.4.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-extend-native