如何在以下逻辑中访问 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 方法?的主要内容,如果未能解决你的问题,请参考以下文章