Object.hasOwnProperty()会生成ESLint 'no-prototype- buildings '错误:如何修复?

我使用下面的逻辑来获取给定键的i18n字符串。

export function i18n(key) {
if (entries.hasOwnProperty(key)) {
return entries[key];
} else if (typeof (Canadarm) !== 'undefined') {
try {
throw Error();
} catch (e) {
Canadarm.error(entries['dataBuildI18nString'] + key, e);
}
}
return entries[key];
}

我在我的项目中使用ESLint。我得到以下错误:

不访问Object。原型方法'hasOwnProperty'从目标对象。 这是一个'no-prototype-builtins'错误。< / p >

如何更改代码来解决此错误?我不想禁用这个规则。

130639 次浏览

你可以通过Object.prototype访问它:

Object.prototype.hasOwnProperty.call(obj, prop);

这样更安全,因为

  • 并非所有对象都继承自Object.prototype
  • 即使是继承自Object.prototype的对象,hasOwnProperty方法也可能被其他方法遮蔽。

当然,上面的代码是这样假设的

  • 全局Object没有被遮蔽或重新定义
  • 本机Object.prototype.hasOwnProperty未被重新定义
  • 没有call own属性被添加到Object.prototype.hasOwnProperty
  • 本机Function.prototype.call未被重新定义

如果这些都不成立,试图以更安全的方式编码,您可能已经破坏了您的代码!

另一种不需要call的方法是

!!Object.getOwnPropertyDescriptor(obj, prop);

这似乎也行得通:

key in entries

因为这将返回一个布尔是否存在的关键对象?

对于您的具体情况,以下示例将起作用:

if(Object.prototype.hasOwnProperty.call(entries, "key")) {
//rest of the code
}

if(Object.prototype.isPrototypeOf.call(entries, key)) {
//rest of the code
}

if({}.propertyIsEnumerable.call(entries, "key")) {
//rest of the code
}

这对我很有用,所以试试吧

let  bug={
name:"test"
}
if (bug && typeof bug === 'object' && Object.prototype.hasOwnProperty.call(bug, name)) {

@前面的答案是正确的

用这个:

Object.prototype.hasOwnProperty.call(object, "objectProperty");

你可以使用Object.hasOwn(entries, key)代替。hasOwn是用来替换Object.hasOwnProperty的。