booYah
booYah

Reputation: 3179

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.

Upvotes: 317

Views: 249015

Answers (9)

Konard
Konard

Reputation: 3024

I've ended up using this code:

const _ = require('lodash');
_.has(entries, key)

Upvotes: 0

Noslac
Noslac

Reputation: 882

You can use Object.hasOwn(obj, prop) instead. hasOwn is intended to be a replacement for Object.hasOwnProperty.

Upvotes: 71

plabon
plabon

Reputation: 71

Object.hasOwn() is officially replacement for Object.prototype.hasOwnProperty().

if this objects has it's own property then it returns true.if property does not exist or inherited then it returns false.so hasOwn() static method and hasOwnProperty() method behaves in a same way.

const object1 = {
  prop: 'exists',
};

console.log(Object.hasOwn(object1, 'prop')); //true.

your code will be

export function i18n(key) {
  if (Object.hasOwn(entries,key)) {
    return entries[key];
  } else if (typeof (Canadarm) !== 'undefined') {
    try {
      throw Error();
    } catch (e) {
      Canadarm.error(entries['dataBuildI18nString'] + key, e);
    }
  }
  return entries[key];
}

Upvotes: 0

onalbi
onalbi

Reputation: 2759

To make code more elegant it can be in form a polyfill:

if (!Object.hasOwn) {
    Object.prototype.hasOwn = function (object, property) {
        return Object.prototype.hasOwnProperty.call(object, property);
    }
}

console.log(Object.hasOwn({test: 1}, 'test'), Object.hasOwn({tes: 1}, 'test'))

Upvotes: 2

Archil Labadze
Archil Labadze

Reputation: 4325

@Orial answer is correct

Use this:

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

Upvotes: 15

Mohammed Al-Reai
Mohammed Al-Reai

Reputation: 2806

this is working for me so try with it

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

}

Upvotes: 1

Xameer
Xameer

Reputation: 31247

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
}

Upvotes: 54

Mike Mathew
Mike Mathew

Reputation: 932

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?

Upvotes: 19

Oriol
Oriol

Reputation: 288270

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);

Upvotes: 496

Related Questions