Преимущество использования Object.hasOwnProperty по сравнению с тестированием, если свойство не определено

Поскольку hasOwnProperty имеет некоторые предостережения и особенности (окно/широкое использование в проблемах Internet  Explorer 8 и т. д.):

Есть ли вообще смысл его использовать? Если просто проверить, является ли свойство неопределенным, будет ли оно более оправданным и более упрощенным?

Например:

var obj = { a : 'here' };

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

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

Я бы предпочел использовать самую современную и кросс-браузерную методологию.

Я также видел этот прототип, перезаписанный для hasOwnProperty, который работает, но я не уверен в его полезности...

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

person Mark Pieszak - Trilon.io    schedule 17.06.2013    source источник
comment
Все, кроме использования hasOwnProperty, гарантированно приведет к ложным срабатываниям или отрицательным результатам.   -  person Xotic750    schedule 17.06.2013
comment
если я знаю, что ищу массив, объект или функцию, я предпочитаю еще проще: if (obj.a) . Конечно, если obj.a может быть нулевым, или ложным, то требуется сравнение его с !== undefined. также этот объект имеет a согласно (a in obj), но не if(obj.a): {a:undefined}   -  person dandavis    schedule 17.06.2013
comment
@FelixKling интересный jsperf. Однако .hasOwnProperty и in имеют совсем другое значение. Цитирование документации Mozilla: "obj.hasOwnProperty(prop)" used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.   -  person Adrien Be    schedule 14.10.2014


Ответы (3)


В качестве дополнительной информации к данному ответу 17150859">автор Pavel Gruba и предоставленный вами полифил:

Насколько мне известно, нет хорошего способа полифила hasOwnProperty для браузеров, которые не поддерживают его изначально. Я видел довольно много разных в дикой природе, и все они дают ложные положительные или отрицательные результаты. Если у меня абсолютно нет альтернативы, то это то, что я создал для себя, но оно также страдает от ложных срабатываний и отрицаний. Согласно MSDN.

Поддерживается в следующих режимах документа: Quirks, стандарты Internet Explorer 6, стандарты Internet Explorer 7, стандарты Internet Explorer 8, стандарты Internet Explorer 9, стандарты Internet Explorer 10. Также поддерживается в приложениях Магазина Windows.

JavaScript

function is(x, y) {
    if (x === y) {
        if (x === 0) {
            return 1 / x === 1 / y;
        }

        return true;
    }

    var x1 = x,
        y1 = y;

    return x !== x1 && y !== y1;
}

function hasOwnProperty(object, property) {
    var prototype;

    return property in object && (!(property in (prototype = object.__proto__ || object.constructor.prototype)) || !is(object[property], prototype[property]));
}

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

var obj = new NewClass();

if (obj.hasOwnProperty("a")) {
    console.log("has property")
}

if (hasOwnProperty(obj, "a")) {
    console.log("has property")
}

На JSFiddle.

person Xotic750    schedule 17.06.2013

Метод hasOwnProperty проверяет, присвоено ли свойство непосредственно объекту.

Таким образом, если свойство 'a' находится в прототипе, hasOwnProperty отфильтрует его.

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

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

Таким образом, hasOwnProperty во многих случаях безопаснее.

person Pavel Gruba    schedule 17.06.2013
comment
Совершенно верно ... Только что понял это после публикации вопроса! Мне трудно найти поддержку браузера для hasOwnProperty, совместим ли он хотя бы с IE7+? - person Mark Pieszak - Trilon.io; 17.06.2013

hasOwnProperty не проверяет неопределенные значения. Он только проверяет, назначено ли свойство объекту, даже если оно не определено:

var obj = { a : undefined };
obj.hasOwnProperty("a") // true
obj.a === undefined     // true
obj.hasOwnProperty("b") // false
obj.b === undefined     // true
person dpineda    schedule 26.03.2015