no-prototype-builtins
禁止直接在对象上调用某些 Object.prototype
方法
在 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.("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 中引入的。