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");