Object.hasOwnProperty() 产生 ESLint 'no-prototype-builtins' 错误:如何修复?

2022-08-30 01:42:41

我使用以下逻辑来获取给定密钥的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.prototype 方法 'hasOwnProperty'。这是一个“无原型内置”错误。

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


答案 1

您可以通过以下方式访问它:Object.prototype

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

这应该更安全,因为

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

当然,上面的代码假设

  • 全球没有被阴影或重新定义Object
  • 原生尚未被重新定义Object.prototype.hasOwnProperty
  • 没有自己的财产被添加到callObject.prototype.hasOwnProperty
  • 原生尚未被重新定义Function.prototype.call

如果其中任何一个不成立,试图以更安全的方式编码,你可能会破坏你的代码!

另一种不需要的方法将是call

!!Object.getOwnPropertyDescriptor(obj, prop);

答案 2

对于您的具体情况,以下示例应有效:

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
}