Do not access Object.prototype method ‘hasOwnProperty’ from target object no-prototype-builtins
今天在升級項目依賴發現報如下錯誤:
Do not access Object.prototype method ‘hasOwnProperty’ from target object no-prototype-builtins
發現是新版本的ESLint使用了禁止直接調用 Object.prototypes 的內置屬性開關,說白了就是ESLint 配置文件中的 "extends": "eslint:recommended" 屬性啟用了此規則。
在ECMAScript 5.1中,新增了 Object.create,它支持使用指定的 [[Prototype]] 創建對象。Object.create(null) 是一種常見的模式,用於創建將用作映射的對象。當假定對象將包含來自Object.prototype 的屬性時,這可能會導致錯誤。該規則防止直接從一個對象調用某些 Object.prototype 的方法。
此外,對象可以具有屬性,這些屬性可以將 Object.prototype 的內建函數隱藏,可能導致意外行為或拒絕服務安全漏洞。例如,web 服務器解析來自客戶機的 JSON 輸入並直接在結果對象上調用 hasOwnProperty 是不安全的,因為惡意客戶機可能發送一個JSON值,如 {"hasOwnProperty": 1},並導致服務器崩潰。
為了避免這種細微的 bug,最好總是從 Object.prototype 調用這些方法。例如,foo.hasOwnProperty("bar") 應該替換為 Object.prototype.hasOwnProperty.call(foo, "bar")。
所以,你可以關閉提示,也可以更新代碼,個人建議更新代碼,畢竟代碼不規范引起的。
