我使用以下逻辑来获取给定密钥的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 '错误。
如何更改代码以解决此错误?我不想禁用此规则。
答案 0 :(得分:48)
您可以通过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);
答案 1 :(得分:4)
这似乎也有效:
key in entries
因为那将返回一个关于键是否存在于对象内的布尔值?
答案 2 :(得分:0)
对于您的具体情况,以下示例应适用:
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
}
答案 3 :(得分:0)
我希望我不会为此而感到失望,但是!
var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }
就目前而言,从来没有破坏过我的代码?但是我不确定在所有网络浏览器中是否都是这种情况...
(此外,如果未定义Canadarm
,即使键不在条目中,您的代码似乎也return entries[key];
。)