Spec-Zone.ru › ESLint

no-prototype-builtins

Запретить прямое обращение к некоторым методам Object.prototype к объектам.

✅ Рекомендуется

Использование конфигурации recommended из @eslint/js в файле конфигурации активирует это правило.

💡 hasSuggestions

Некоторые проблемы, выявленные этим правилом, можно вручную исправить с помощью предложений редактора.

В ECMAScript 5.1 был добавлен Object.create, который позволяет создавать объекты с указанным [[Prototype]]. Object.create(null) — распространённый шаблон для создания объектов, которые будут использоваться как Map. Это может привести к ошибкам, если предполагается, что объекты будут иметь свойства из Object.prototype. Это правило предотвращает прямое обращение к некоторым методам Object.prototype к объекту.

Кроме того, объекты могут иметь свойства, которые маскируют встроенные методы Object.prototype, что может привести к нежелательному поведению или уязвимостям с отказом в обслуживании. Например, веб-серверу небезопасно парсить входной JSON от клиента и вызывать hasOwnProperty напрямую на полученном объекте, так как злонамеренный клиент может отправить значение JSON, такое как {"hasOwnProperty": 1}, и привести к сбою сервера.

Чтобы избежать подобных скрытых ошибок, лучше всегда вызывать эти методы из Object.prototype. Например, foo.hasOwnProperty("bar") следует заменить на Object.prototype.hasOwnProperty.call(foo, "bar").

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

Это правило запрещает прямое обращение к некоторым методам Object.prototype к экземплярам объектов.

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

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

var hasBarProperty = foo.hasOwnProperty("bar");

var isPrototypeOfBar = foo.isPrototypeOf(bar);

var barIsEnumerable = foo.propertyIsEnumerable("bar");

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

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

var hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar");

var isPrototypeOfBar = Object.prototype.isPrototypeOf.call(foo, bar);

var barIsEnumerable = {}.propertyIsEnumerable.call(foo, "bar");

Когда не следует использовать

Возможно, стоит отключить это правило, если ваш код взаимодействует только с объектами, имеющими жёстко заданные ключи, и вы никогда не будете использовать объект, маскирующий метод Object.prototype или который не наследуется от Object.prototype.

Версия

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

Ссылки

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

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

Spec-Zone.ru

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