Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins

今天使用对象方法hasOwnProperty时,ESLint报了如下错误:

Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins
上述文字字面意思是:“不要从目标对象访问 Object 原型方法”,一种解决办法是用call改变指向调用:

1
Object.prototype.hasOwnProperty.call(obj, 'key')

这是新版本的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")
参考地址:https://www.cnblogs.com/superclound/p/12202576.html