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")
。
规则详情
amK0sYL4lzAWr/LxHRAloA52N46K7CVLBsx3U/nreWOlaLH6ORIrslKOdf7coZ2TThCgXF61kfy0uPJgXd20fPjirWAqtyVkyNakP67dfXsPfFfnSL028Zsv7BDwUhmH
zblpFAyoEiDF1GS7EEgT+Fw+zDBsVLJNOcYSNQAXW6dSdz0JClE4rOOJ51S8csCM
/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = foo.hasOwnProperty("bar");
var isPrototypeOfBar = foo.isPrototypeOf(bar);
var barIsEnumerable = foo.propertyIsEnumerable("bar");
h+1Jf/rEEE6yYiKhWnK/aHl9/UYIfowckm44qhmqvwwaWj0QX+JXnab7YJgxSmDw
/*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");
何时不使用
TE4kphJ8JHch0g7ZOr3zrRIUrHHH44vHMMfcIgnMr5XAaqEb3qSLPx8tNnpqEigYf7zSeK4dr6LCVSGb0tktXDCZ6aj1mpU+fXTBT2o00TupIOBOLm7d0O0qlEKPaH7Zw1RUsfvbj8j6LK05ZXV+sHjGNjmADBxWAf8ZcrpSBY9n3Xhr6OAYGeFAdNIsw4IzTLiZumN3H1ODczW0dWumIZzQ419NdZ6COU0avXmMo9yYBL5O/4C1QvXws0fWVQeed7nc7x864vu8IClPLGQdsSQz8gqNmxWCmbEJuN/0jik=