Spec-Zone.ru › ESLint

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). Однако если это правило строго соблюдается во всей кодовой базе, делать это не потребуется.

Описание правила

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

Примеры кода, нарушающего это правило:

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

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

Параметры

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

exceptions

Примеры кода, соответствующего правилу при использовании примера параметра { "exceptions": ["Object"] }:

Открыть в Playground
/*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 способом, совместимым с будущими версиями.

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

  • 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