如何使用以下逻辑访问Object.prototype方法?


91

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

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


9
您可能应该阅读文档。有正确代码的示例〜eslint.org
Phil

1
建议您使用Object.hasOwnProperty(entries,key)
激情

该代码工作正常。这是棉绒错误。我只想修改语法,以便满足皮棉规则。
booYah

1
@passion将进行字符串化entries,忽略key,并检查是否Object具有该字符串的属性。
Oriol

Answers:


149

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

14

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

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
}

11

看来这也可以工作:

key in entries

因为这将返回一个布尔值,该键是否存在于对象内部?


3
hasOwnProperty检查字符串或符号是否是自己的属性。key in entries检查它是自己的还是继承的。
Oriol

0

我希望我不会对此感到失望,也许会,但是!

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

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

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


1
问题是,如果a确实有原型c,那将会发生。Js将走上原型链
Bernardo Dal Corno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.