javascriptjavascript-objectsprototypal-inheritancehasownproperty

Object.hasOwn() vs Object.prototype.hasOwnProperty()


The new method Object.hasOwn() returns a boolean indicating whether the specified object has the indicated property as its own property but so does Object.prototype.hasOwnProperty(), what is the difference between them and what is the benefit of using one over the other?


Solution

  • Using Object.hasOwn() as a replacement for Object.hasOwnProperty()

    Object.hasOwn() is intended as a replacement for Object.hasOwnProperty() and is a new method available to use (yet still not fully supported by all browsers like safari yet but soon will be)

    Object.hasOwn() is a static method which returns true if the specified object has the specified property as its own property. If the property is inherited, or does not exist, the method returns false.

    const person = { name: 'John' };
    console.log(Object.hasOwn(person, 'name'));// true
    console.log(Object.hasOwn(person, 'age'));// false
    
    console.log(person.hasOwnProperty('name'));// true
    console.log(person.hasOwnProperty('age'));// false
    
    const person2 = Object.create({gender: 'male'});
    console.log(Object.hasOwn(person2, 'gender')); // false
    console.log(person.hasOwnProperty('gender')); //false
     
    // gender is not an own property of person, it exist on the person2 prototype

    So, after looking at both Object.hasOwn() and Object.hasOwnProperty() in action, they seem quite the same.. So why should we use Object.hasOwn() over the Object.hasOwnProperty()?

    It is recommended to this method use over the Object.hasOwnProperty() because it also works for objects created by using Object.create(null) and for objects that have overridden the inherited hasOwnProperty() method. Although it's possible to solve these kind of problems by calling Object.prototype.hasOwnProperty.call(<object reference>, <property name>) on an external object, Object.hasOwn() overcome these problems, hence is preferred (see examples below)

    let person = {
      hasOwnProperty: function() {
        return false;
      },
      age: 35
    };
     
    console.log(Object.hasOwn(person, 'age')); // true
    console.log(person.hasOwnProperty('age')); // false

    let person = Object.create(null);
    person.age = 35;
    if (Object.hasOwn(person, 'age')) {
      console.log(person.age); // true - works regardless of how the object was created
    }
    
    if (person.hasOwnProperty('age')){ // throws error - person.hasOwnProperty is not a function
       console.log('hasOwnProperty' + person.age);
    }

    More about Object.hasOwn can be found here : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

    Browser compatibility - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility