2012-10-04 10 views
51

Mögliche Duplizieren:
How do I check to see if an object has a property in Javascript?for..in und hasOwnProperty

fand ich den folgenden Ausschnitt in JS-Dateien Gezwitscher. Ich habe mich gefragt, warum sie die hasOwnProperty-Funktion aufrufen müssen, um zu sehen, dass 'dict' die Eigenschaft 'key' hat? Die for-Schleife läuft für jeden 'Schlüssel' in 'dict', was bedeutet 'dict' hat 'Schlüssel'. Fehle ich einen Punkt?

function forEach(dict, f) { 
    for (key in dict) { 
     if (dict.hasOwnProperty(key)) 
      f(key, dict[key]); 
    } 
} 
+3

Es ist gut erklärt hier: http://StackOverflow.com/a/136411/27512 – kevingessner

+0

Scheint wie 'Schlüssel' ist global wo ist dieser Code aus, können Sie einen Link zu ihm? – elclanrs

+0

@elclanrs Ich habe mich geirrt. Dieser Code stammt von Chrome utils.js – scusyxx

Antwort

54

Denn wenn Sie dies nicht tun, wird es eine Schleife durch jede Eigenschaft auf der Prototypkette, darunter auch solche, die Sie nicht wissen, über (die möglicherweise von jemandem mit nativen Objekt Prototyp Messing hinzugefügt wurden).

Auf diese Weise werden nur die Schlüssel garantiert, die sich an dieser Objektinstanz selbst befinden.

+0

Vielen Dank. Es macht jetzt mehr Sinn .. – scusyxx

5

Jedes Objekt auf Javascript ein Wörterbuch ist, bedeutet dies, dass „toString“ und jede andere Methode ein Schlüssel jedes Objekt ist

var myObj = {}; 
console.log(myObj["toString"]); 

Aber diese Funktion von Objektklasse geerbt wird, so hasOwnProperty Sie, wenn diese sagt Der Schlüssel gehört dem Wörterbuch oder ist vererbt.

"toString" in myObj; // true 
myObj.hasOwnProperty("toString") // false 
1

@blockhead ist hier richtig. Zum Beispiel, Prototype.js Framework verwendet, um native Arrays mit zusätzlichen Hilfsmethoden zu erweitern (ich kenne die Situation mit aktuellen Versionen eines Frameworks nicht). Die direkte Verwendung von "for (key in dict)" würde also alle Elemente der div plus-Referenzen auf Hilfsmethoden zurückgeben. Was ist irgendwie unerwartet :)

26

Die hasOwnProperty Methode lässt Sie wissen, ob eine Eigenschaft direkt auf eine Instanz eines Objekts oder geerbt von seiner Prototyp-Kette ist.

Betrachten Sie die folgende

function ObjWithProto() { 
    this.foo = 'foo_val'; 
} 

ObjWithProto.prototype = {bar: 'bar_val'}; 

var dict = new ObjWithProto(); 
dict.foobar = 'foobar_val'; 

das heißt Sie haben ein Objektdict mit Eigenschaften foo und foobar, die eine Eigenschaft bar von seinen Prototypkette übernimmt.

Jetzt ist es durchlaufen (eine modifizierte Version) Code

function forEach(dict) { 
    var key; 
    for (key in dict) { 
     if (dict.hasOwnProperty(key)) console.log('has', key, dict[key]); 
     else console.log('not', key, dict[key]); 
    } 
} 
forEach(dict); 

Sie

has foo foo_val 
has foobar foobar_val 
not bar bar_val 

Auf diese Weise können Sie separate Objekte sehen, dass ein Objekt selbst hat und die von ihr geerbt hat (die sind in der Regel Methoden, die für die Schleife nicht relevant sind)

Außerdem, wenn Sie jetzt dict.bar = 'new_bar_val'; tun, wird das letzte Ergebnis zuändern, sodass Sie sogar zwischen gleichnamigen Eigenschaften unterscheiden können.