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

新手上路,请多包涵

我正在使用以下逻辑来获取给定键的 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”。这是一个“ no-prototype-builtins ”错误。

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

原文由 booYah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 734
1 个回答

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

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

那应该更安全,因为

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

当然,上面的代码假设

  • 全局 Object 没有被隐藏或重新定义
  • 本机 Object.prototype.hasOwnProperty 尚未重新定义
  • 没有 call 自己的财产已添加到 Object.prototype.hasOwnProperty
  • 本机 Function.prototype.call 尚未重新定义

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

另一种不需要 call 的方法是

!!Object.getOwnPropertyDescriptor(obj, prop);

原文由 Oriol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题