ESLint 的 no-prototype-builtins 規則

解決問題

最近在開發中遇到一個 ESLint 規則問題:安全

obj.hasOwnProperty('key')
複製代碼

ESLint 給出錯誤提示:ui

Do not access Object.prototype method 'hasOwnProperty' from target object. eslint(no-prototype-builtins)this

當時沒想明白這個規則的設計點在哪裏。根據其文字提示「不要從目標對象訪問 Object 原型方法」,想到一種解決方案——直接找到這個方法,用 call 改變指向調用:spa

Object.prototype.hasOwnProperty.call(obj, 'key')
複製代碼

背後的原理

今天在想到原型鏈的時候忽然意識到爲什麼 ESLint 不容許從目標對象調用 Object 原型方法。prototype

在 JS 中,每每經過改變原型鏈實現繼承。一旦原型鏈發生改變,原先能夠訪問到的原型屬性、方法即可能沒法訪問。考慮最極端的狀況,若 obj 原先原型鏈的最頂端是 Object,此時能夠經過原型鏈訪問 Object.hasOwnProperty 方法;而若改變後,頂端再也不是 Object,那麼訪問 obj.hasOwnProperty 訪問就會獲得 undefined。所以,直接從對象訪問原型方法,極可能會帶來隱藏的 BUG。設計

我採用的解決方法也是合理的,即直接在 Object 對象上調用其方法,利用 call 改變其 this 指向到咱們的目標對象上,便可安全使用 hasOwnProperty 方法了。eslint

雖然改變 this 指向的操做並不優雅,但目前我也沒有更好解決方案了。code

相關文章
相關標籤/搜索