Prototyp innerhalb des Konstruktors zuweisen

8

Ich habe diesen Code:

%Vor%

Die Ausgabe sagt mir, dass a keine Methode namens getA ()

hat

Ich nahm an, dass das Ausführen von this.prototype = new MyClass () im Konstruktor für SecondClass dazu führen würde, dass Methoden von MyClass?

Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, aber ich versuche das Verhalten des Prototyp-Schlüsselworts zu verstehen.

    
user350325 23.04.2013, 15:53
quelle

2 Antworten

12

prototype ist eine spezielle Eigenschaft der -Konstruktorfunktion , nicht der -Instanz .

Wenn Sie die Konstruktorfunktion mit new Func() aufrufen, erstellt die Engine ein neues Objekt, das von Func.prototype erbt und setzt dann this innerhalb der Konstruktorfunktion, um auf das neue Objekt zu verweisen.

Also, abgesehen davon, dass this.prototype nur eine gewöhnliche Eigenschaft ist, fand die Vererbung bereits statt, als die Zuweisung stattfindet.

Da Sie MyClass.prototype keine Methoden zuweisen, müssen Sie hier nichts mit der Vererbung von Prototypen tun. Sie müssen lediglich MyClass auf die neu erstellte Instanz anwenden, indem Sie .call [MDN] :

%Vor%

Sie sollten jedoch alle Methoden hinzufügen, die von Instanzen für den Prototyp freigegeben werden und dann jede Instanz von% co_de zulassen % erben von ihm. So könnte ein komplettes Setup aussehen:

%Vor%

All dies wird in ES6 einfacher .

    
Felix Kling 23.04.2013, 16:01
quelle
3

Eine Eigenschaft namens "Prototyp" ist nur für Objekte interessant, die Funktionen sind. Das Zuweisen eines Werts zu der "Prototyp" -Eigenschaft in Ihrem Konstruktor hat keine Auswirkung (in diesem Fall); Was zählt, wäre die "Prototyp" -Eigenschaft der Konstruktorfunktion selbst.

%Vor%

oder so. Das Prototyp-Objekt eines Konstruktors wird von allen konstruierten Instanzen gemeinsam genutzt. Daher macht es auch wenig Sinn, den Prototyp durch einen Konstruktor-Parameter variieren zu lassen.

Sie könnten auch den Konstruktor "MyClass" von "SecondClass" aus aufrufen:

%Vor%

Das hätte zur Folge, dass das this , das im Aufruf new SecondClass() konstruiert wurde, durch den Konstruktor "MyClass" dekoriert wird. Es wäre nicht wirklich Vererbung, aber Sie würden eine "getA" -Funktion bekommen.

    
Pointy 23.04.2013 15:57
quelle

Tags und Links