2010-12-30 13 views
4

Ich versuche zu verstehen, wie Prototypen funktionieren. Warum bricht das Folgende?Einen Objekt-Prototyp ausschalten

var A = function A(){this.a = 0}, 
    aa = new A; 

A.prototype = {hi:"hello"}; 

aa.constructor.prototype //->{hi:"hello"} ok so far :) 

aa.hi //undefined?? why? :(
+1

woops, machte eine Korrektur – John

+0

entfernt Gruß an aa.hi:, tun Sie es nicht beim nächsten Mal –

Antwort

12

Ich glaube, Sie in der letzten Zeile gemeint aa.hi statt aa.hello.

Es gibt Ihnen undefined weil die A.prototypenach das neue Objekt zugeordnet (aa) bereits erstellt wurde.

In Ihrer zweiten Zeile:

//... 
aa = new A; 
//... 

Dies ein Objekt erstellen wird, die von A.prototype, in diesem Moment erbt, ist A.prototype ein einfaches leeres Objekt, das von Object.prototype erbt.

Dieses Objekt wird durch die interne [[Prototype]]-Eigenschaft der Objektinstanz aa referenziert.

Durch das Ändern von A.prototype danach wird die direkte Vererbungsbeziehung zwischen aa und diesem Objekt nicht geändert.

In der Tat gibt es keine Standardmethode zum Ändern der internen Eigenschaft [[Prototype]], einige Implementierungen bieten Ihnen Zugriff über eine nicht standardmäßige Eigenschaft namens __proto__.

die erwarteten Ergebnisse erhalten, versuchen:

var A = function A() { this.a = 0 }; 
A.prototype = { hi:"hello" }; 

var aa = new A; 

aa.hi; // "hello" 
+3

+1 - Might "Vielen Dank im Voraus!" Es lohnt sich hinzuzufügen, dass, wenn das OP dem Prototyp eine Eigenschaft hinzugefügt hat, anstatt ihm ein neues Objekt zuzuweisen, "aa.hi" '' hallo "' zurückgeben würde. –

+0

Danke! Ich wusste nichts über den internen [Prototyp]]. Gibt es so etwas wie einen internen Konstruktor? – John