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

相关文章
相关标签/搜索