Object.hasOwnProperty() yields the ESLint 'no-prototype-builtins' error: how to fix?

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.

4

5 Answers

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, the hasOwnProperty 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 to Object.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); 

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 } 
1

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?

1

@Orial answer is correct

Use this:

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

this is working for me so try with it

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

}

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like