# no-prototype-builtins

禁止直接在对象上调用某些 Object.prototype 方法

配置文件中的 "extends": "eslint:recommended" 属性启用了该规则

在 ECMAScript 5.1 中,添加了 Object.create,它允许创建具有指定 [[Prototype]] 的对象。Object.create(null) 是一种常见的模式,用于创建将用作 Map 的对象。当假定对象将具有 Object.prototype 的属性时,这可能会导致错误。此规则防止直接从对象调用某些 Object.prototype 方法。

此外,对象可能具有隐藏 Object.prototype 上的内置函数的属性,可能导致意外行为或拒绝服务安全漏洞。例如,Web 服务器解析来自客户端的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户端可以发送像 {"hasOwnProperty": 1} 这样的 JSON 值并导致服务器崩溃。

为避免此类细微错误,最好始终从 Object.prototype 调用这些方法。例如,应将 foo.hasOwnProperty("bar") 替换为 Object.prototype.hasOwnProperty.call(foo, "bar")

# 规则详情

此规则不允许直接在对象实例上调用某些 Object.prototype 方法。

此规则的错误代码示例:

/*eslint no-prototype-builtins: "error"*/

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

var isPrototypeOfBar = foo.isPrototypeOf(bar);

var barIsEnumerable = foo.propertyIsEnumerable("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 的对象。

Last Updated: 5/13/2023, 8:55:38 PM