我使用下面的逻辑来获取给定键的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”错误。

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


当前回答

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

其他回答

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

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

这样更安全,因为

并非所有对象都继承自Object.prototype 即使是继承自Object的对象。在原型中,hasOwnProperty方法可以被其他方法遮蔽。

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

全局对象没有被遮蔽或重新定义 原生Object.prototype.hasOwnProperty没有被重新定义 Object.prototype.hasOwnProperty中没有添加call own属性 原生Function.prototype.call没有被重新定义

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

另一种不需要调用的方法是

!!Object.getOwnPropertyDescriptor(obj, prop);

这似乎也行得通:

输入关键字

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

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

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

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
}

@前面的答案是正确的

用这个:

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