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"*/
const hasBarProperty = foo.("bar");
const isPrototypeOfBar = foo.(bar);
const barIsEnumerable = foo.("bar");
Примеры правильного кода для этого правила:
/*eslint no-prototype-builtins: "error"*/
const hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar");
const isPrototypeOfBar = Object.prototype.isPrototypeOf.call(foo, bar);
const 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