no-prototype-builtins
Запретить прямое обращение к некоторым методам Object.prototype к объектам.
Использование конфигурации recommended из @eslint/js в файле конфигурации активирует это правило.
Некоторые проблемы, выявленные этим правилом, можно вручную исправить с помощью предложений редактора.
В 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 к экземплярам объектов.
Примеры некорректного кода для этого правила:
/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = foo.("bar");
var isPrototypeOfBar = foo.(bar);
var barIsEnumerable = foo.("bar");
Примеры корректного кода для этого правила:
/*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