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

问题描述 投票:0回答:8

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

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

javascript ecmascript-6 eslint
8个回答
448
投票

您可以通过

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);

54
投票

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

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
}

33
投票

您可以使用

Object.hasOwn(entries, key)
代替。 hasOwn 旨在替代
Object.hasOwnProperty


20
投票

看来这也行得通:

key in entries

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


14
投票

@口头回答正确

使用这个:

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

2
投票

为了使代码更优雅,可以采用polyfill的形式:

if (!Object.hasOwn) {
    Object.prototype.hasOwn = function (object, property) {
        return Object.prototype.hasOwnProperty.call(object, property);
    }
}

console.log(Object.hasOwn({test: 1}, 'test'), Object.hasOwn({tes: 1}, 'test'))


0
投票

这对我有用,所以尝试一下

let  bug={
 name:"test"
   }
if (bug && typeof bug === 'object' && Object.prototype.hasOwnProperty.call(bug, name)) {

}


0
投票
function hasOwnProperty<X, Y extends PropertyKey>(
  obj: X,
  prop: Y
): obj is X & Record<Y, unknown> {
  return typeof obj === 'object' && obj !== null && Object.hasOwnProperty.call(obj, prop)
}
© www.soinside.com 2019 - 2024. All rights reserved.