Benefit of using Object.hasOwnProperty vs. testing if a property is undefined

Mark Pieszak - Trilon.io picture Mark Pieszak - Trilon.io · Jun 17, 2013 · Viewed 19k times · Source

Since hasOwnProperty has some caveats and quirks (window / extensive use in Internet Explorer 8 issues, etc.):

Is there any reason to even use it? If simply testing if a property is undefined, is it better justified and more simplistic?

For example:

var obj = { a : 'here' };

if (obj.hasOwnProperty('a')) { /* do something */ }

if (obj.a !== undefined) { /* do something */ }
// Or maybe (typeof (obj.a) !== 'undefined')

I'd prefer to be using the most cross-browser friendly, and up to date methodology.

I've also seen this prototype overwritten for hasOwnProperty, which works, but I'm not sold on its usefulness...

if (!Object.prototype.hasOwnProperty) {
    Object.prototype.hasOwnProperty = function(prop) {
        var proto = this.__proto__ || this.constructor.prototype;
        return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
    };
}

Answer

Pavel Gruba picture Pavel Gruba · Jun 17, 2013

The hasOwnProperty method checks that a property is assigned to the object directly.

So, if property 'a' is in the prototype, hasOwnProperty will filter that.

function NewClass() {}
NewClass.prototype = { a: 'there' };
var obj = new NewClass();

if (obj.hasOwnProperty('a')) { /* Code does not work */ }
if (obj.a !== undefined) { /* Code works */ }

So, hasOwnProperty is safer in many cases.