2010-03-30 2 views
8

In einem article auf yuiblog sagt Douglas Crockford, dass die for in-Anweisung über die Methoden eines Objekts iterieren wird. Warum erzeugt der folgende Code ["a", "b", "c", "d", "toString"] nicht? Sind nicht .toString() und andere Methoden Mitglieder von my_obj?Spricht JavaScript für In-Schleife über Methoden?

Object.prototype.toString = function(){return 'abc'} 
Object.prototype.d = 4; 

my_obj = { 
    'a':1, 
    'b':2, 
    'c':3 
} 

a = [] 
for (var key in my_obj) { 
    a.push(key) 
} 

console.log(a) // prints ["a", "b", "c", "d"] 

Antwort

12

Alle benutzerdefinierten Eigenschaften sind aufzählbar, einschließlich der vom Prototyp geerbten Eigenschaften. Die integrierten nativen Eigenschaften sind nicht. toString() ist einer von ihnen. Sehen Sie hier https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

bearbeiten: Meine Interpretation „Allerdings wird die Schleife durchlaufen alle benutzerdefinierten Eigenschaften (einschließlich aller, die integrierten Eigenschaften überschreiben)“ ist, dass die Eigenschaften, die direkt in die überschrieben werden Objekt wird aufzählbar. Nicht das Überschreiben im Prototyp selbst. Das heißt:

var my_obj = {a: 1, b: 2, c: 3}; 
my_obj.toString = function() {return 'abc';}; 

a = [] 
for (var key in my_obj) { 
    a.push(key) 
} 

console.log(a) // prints ["a", "b", "c", "toString"] 
+2

Ja, 'Object.prototype.toString.propertyIsEnumerable() == false' – CMS

+0

Aus dem Dokument verknüpft:„A für ... in Schleife nicht durchlaufen nicht integrierten Eigenschaften handelt. Dazu gehören alle integrierten Methoden von Objekten, wie die index_of-Methode von String oder die toString-Methode von Object. Die Schleife wird jedoch über alle benutzerdefinierten Eigenschaften (einschließlich aller, die die integrierten Eigenschaften überschreiben) iteriert. " Warum sagt das Dokument, dass "einschließlich alle, die integrierte Eigenschaften überschreiben", wenn in meinem Beispiel .toString() nicht überschrieben wird? – hekevintran

+0

@hekevintran: Meine Antwort aktualisiert. –

2

for..in iteriert über benutzerdefinierte Eigenschaften. Wenn Sie Ihren Code ändern:

Object.prototype.foo = function() { return 'abc'; }; 

Dann

console.log(a); 

Will Ausgang:

["a", "b", "c", "foo", "d"] 

Wie Chetan Sastry spitz darauf hingewiesen wird toString anders behandelt, da es einen eingebauten in ist, native Eigenschaft.

Verwandte Themen