跳至内容

eslint/no-prototype-builtins 迂腐的

它的作用

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

为什么这是不好的?

在 ECMAScript 5.1 中添加了 Object.create,它允许创建具有指定 [[Prototype]] 的对象。Object.create(null) 是一个常用来创建用作 Map 的对象的常见模式。当假定对象将具有 Object.prototype 的属性时,这会导致错误。此规则可防止直接从对象中调用一些 Object.prototype 方法。此外,对象可能拥有在 Object.prototype 上隐藏内置对象的属性,可能导致意外行为或拒绝服务安全漏洞。例如,对于网络服务器来说,直接从客户端解析 JSON 输入并在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户端可以发送像 {"hasOwnProperty": 1} 这样的 JSON 值并导致服务器崩溃。

为了避免此类难以察觉的错误,最好总是从 Object.prototype 调用这些方法。例如,应将 foo.hasOwnProperty("bar") 替换为 Object.prototype.hasOwnProperty.call(foo, "bar").

示例

javascript
var hasBarProperty = foo.hasOwnProperty("bar");
var isPrototypeOfBar = foo.isPrototypeOf(bar);
var barIsEnumerable = foo.propertyIsEnumerable("bar");

参考资料

在 MIT 许可下发布。