Vorteil der Verwendung von Object.hasOwnProperty im Vergleich zum Testen, ob eine Eigenschaft nicht definiert ist

Lesezeit: 3 Minuten

Benutzer-Avatar
Mark Pieszak – Trilon.io

Seit hatEigeneEigenschaft hat einige Vorbehalte und Macken (Fenster / umfangreiche Verwendung in Internet Explorer 8-Problemen usw.):

Gibt es einen Grund, es überhaupt zu verwenden? Wenn einfach getestet wird, ob eine Eigenschaft nicht definiert ist, ist es dann besser gerechtfertigt und einfacher?

Zum Beispiel:

var obj = { a : 'here' };

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

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

Ich würde es vorziehen, die Cross-Browser-freundlichste und aktuellste Methodik zu verwenden.

Ich habe auch gesehen, wie dieser Prototyp für hasOwnProperty überschrieben wurde, was funktioniert, aber ich bin nicht von seiner Nützlichkeit überzeugt …

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

  • Alles andere als verwenden hasOwnProperty garantiert falsch positive oder negative Ergebnisse

    – Xotic750

    17. Juni 2013 um 15:10 Uhr


  • Wenn ich weiß, dass ich nach einem Array oder Objekt oder einer Funktion suche, bevorzuge ich es noch einfacher: if (obj.a) . Wenn obj.a null, “”, oder falsch sein kann, ist natürlich ein Vergleich mit !== undefiniert erforderlich. auch dieses Objekt hat ein “a” gemäß (“a” in obj), aber nicht if(obj.a): {a:undefined}

    – dandavis

    17. Juni 2013 um 15:10 Uhr


  • Zusätzliche Informationen: Sie könnten diesen jsPerf-Test interessant finden: jsperf.com/hasownproperty-vs-in/2. Endeffekt: .hasOwnProperty ist viel langsamer als jede andere Art, die Existenz von Eigenschaften zu testen (das war überraschend für mich TBH).

    – Felix Klinge

    17. Juni 2013 um 15:31 Uhr


  • @FelixKling interessant jsperf. Jedoch .hasOwnProperty und in ganz andere Bedeutung haben. Zitieren Mozilla-Dokumentation: "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.

    – Adrien Be

    14. Oktober 2014 um 9:02 Uhr

Benutzer-Avatar
dpineda

hasOwnProperty prüft nicht auf undefinierte Werte. Es prüft nur, ob dem Objekt eine Eigenschaft zugewiesen ist, auch wenn sie undefiniert ist:

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

Benutzer-Avatar
Paul Gruba

Die Methode hasOwnProperty prüft, ob dem Objekt direkt eine Eigenschaft zugewiesen ist.

Wenn also die Eigenschaft ‘a’ im Prototyp vorhanden ist, wird hasOwnProperty diese filtern.

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

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

Daher ist hasOwnProperty in vielen Fällen sicherer.

  • Sehr wahr … Das ist mir gerade klar geworden, nachdem ich die Frage gestellt hatte! Es fällt mir schwer, Browserunterstützung für hasOwnProperty zu finden, ist sie mindestens mit IE7+ kompatibel?

    – Mark Pieszak – Trilon.io

    17. Juni 2013 um 15:15 Uhr

Benutzer-Avatar
Xotic750

Als weitere Informationen zu der Antwort von Pavel Gruba und dem von Ihnen gelieferten Polyfil:

Nach meinem besten Wissen gibt es keinen guten Weg zum Polyfilieren hasOwnProperty für Browser, die es nicht nativ unterstützen. Ich habe einige verschiedene in freier Wildbahn gesehen und sie alle produzieren falsch positive oder negative Ergebnisse. Wenn ich absolut keine Alternative habe, dann habe ich dies für meinen Gebrauch erstellt, aber es leidet auch unter falsch positiven und negativen Ergebnissen. Entsprechend MSDN.

Unterstützt in den folgenden Dokumentmodi: Quirks, Internet Explorer 6-Standards, Internet Explorer 7-Standards, Internet Explorer 8-Standards, Internet Explorer 9-Standards, Internet Explorer 10-Standards. Wird auch in Windows Store-Apps unterstützt.

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")
}

Auf JSFiddle.

1051930cookie-checkVorteil der Verwendung von Object.hasOwnProperty im Vergleich zum Testen, ob eine Eigenschaft nicht definiert ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy