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

Posted

技术标签:

【中文标题】如何在以下逻辑中访问 Object.prototype 方法?【英文标题】:Object.hasOwnProperty() yields the ESLint 'no-prototype-builtins' error: how to fix? 【发布时间】:2017-01-10 00:11:00 【问题描述】:

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

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

【问题讨论】:

您可能应该阅读文档。有正确代码的例子~eslint.org/docs/rules/no-prototype-builtins 建议你使用Object.hasOwnProperty(entries,key) ? 代码运行良好。这是一个 linting 错误。我只想修改语法,以满足 linting 规则。 @passion 这将字符串化entries,忽略key,并检查Object 是否具有该字符串的属性。 【参考方案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);

【讨论】:

【参考方案2】:

对于您的具体情况,以下示例应有效:

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

【讨论】:

最后一个例子(propertyIsEnumerable)对我有用,谢谢【参考方案3】:

这似乎也可以:

key in entries

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

【讨论】:

hasOwnProperty 检查字符串或符号是否为自己的属性。 key in entries 检查它是自己的还是继承的。【参考方案4】:

@Orial 回答正确

使用这个:

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

【讨论】:

【参考方案5】:

这对我有用,所以试试吧

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

【讨论】:

好的,谢谢你告诉我

以上是关于如何在以下逻辑中访问 Object.prototype 方法?的主要内容,如果未能解决你的问题,请参考以下文章

JS 如何判断精确的判断数据类(数组对象)

如何在spring security中逻辑组合pathMatchers

如何将远程数据访问(通过 http)逻辑与业务逻辑分开?

红宝书第22章高级技巧

如何访问 Acumatica 业务逻辑中的表的扩展

域驱动设计中的访问控制