Spec-Zone.ru › ESLint

no-extend-native

Запрет расширения встроенных типов

В JavaScript вы можете расширять любые объекты, включая встроенные или «нативные» объекты. Иногда люди изменяют поведение этих нативных объектов способами, которые нарушают предположения, сделанные о них в других частях кода.

Например, здесь мы перезаписываем встроенный метод, который затем повлияет на все объекты, даже на другие встроенные.

// seems harmless
Object.prototype.extra = 55;

// loop through some userIds
var users = {
    "123": "Stan",
    "456": "David"
};

// not what you'd expect
for (var id in users) {
    console.log(id); // "123", "456", "extra"
}

Общее предложение для решения этой проблемы — обернуть внутреннюю часть for цикла с помощью users.hasOwnProperty(id). Однако, если это правило строго соблюдается во всем вашем кодовом основании, вам не нужно будет делать этот шаг.

Подробности правила

Запрещает прямое изменение прототипа встроенных объектов.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-extend-native: "error"*/

Object.prototype.a = "a";
Object.defineProperty(Array.prototype, "times", { value: 999 });

Параметры

Это правило принимает параметр exceptions, который можно использовать для указания списка встроенных объектов, для которых разрешены расширения.

Исключения

Примеры правильного кода для примера { "exceptions": ["Object"] } параметра:

Открыть в Playground
/*eslint no-extend-native: ["error", { "exceptions": ["Object"] }]*/

Object.prototype.a = "a";

Известные ограничения

Это правило не сообщает о следующих менее очевидных подходах к модификации прототипа встроенных объектов:

var 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 в дружественном к будущему стиле.

Связанные правила

  • no-global-assign

Версия

Это правило было введено в ESLint v0.1.4.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-extend-native

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API