问题
I am using the following logic to get the i18n string of the given key.
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];
}
I am using ESLint in my project. I am getting the following error:
Do not access Object.prototype method 'hasOwnProperty' from target object. It is a 'no-prototype-builtins' error.
How do I change my code to resolve this error ? I don't want to disable this rule.
回答1:
You can access it via Object.prototype
:
Object.prototype.hasOwnProperty.call(obj, prop);
That should be safer, because
- Not all objects inherit from
Object.prototype
- Even for objects which inherit from
Object.prototype
, thehasOwnProperty
method could be shadowed by something else.
Of course, the code above assumes that
- The global
Object
has not been shadowed or redefined - The native
Object.prototype.hasOwnProperty
has not been redefined - No
call
own property has been added toObject.prototype.hasOwnProperty
- The native
Function.prototype.call
has not been redefined
If any of these does not hold, attempting to code in a safer way, you could have broken your code!
Another approach which does not need call
would be
!!Object.getOwnPropertyDescriptor(obj, prop);
回答2:
It seems like this would also work:
key in entries
since that will return a boolean on whether or not the key exists inside the object?
回答3:
For your specific case, the following examples shall work:
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
}
回答4:
I hope I won't get downvoted for this, probably will, but !
var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }
Has, insofar, never broken my code 😬 But I'm not sure if it is the case in all web browsers...
(Also, if Canadarm
is undefined, your code seem to return entries[key];
even if key is not in entries...)
来源:https://stackoverflow.com/questions/39282873/how-do-i-access-the-object-prototype-method-in-the-following-logic