如何在以下逻辑中访问Object.prototype方法?

时间:2016-09-02 00:57:23

标签: javascript ecmascript-6 eslint

我使用以下逻辑来获取给定密钥的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 '错误。

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

4 个答案:

答案 0 :(得分:48)

您可以通过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);

答案 1 :(得分:4)

这似乎也有效:

key in entries

因为那将返回一个关于键是否存在于对象内的布尔值?

答案 2 :(得分:0)

对于您的具体情况,以下示例应适用:

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

OR

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

OR

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

答案 3 :(得分:0)

我希望我不会为此而感到失望,但是!

var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }

就目前而言,从来没有破坏过我的代码?但是我不确定在所有网络浏览器中是否都是这种情况...

(此外,如果未定义Canadarm,即使键不在条目中,您的代码似乎也return entries[key];。)