Ich erstelle zwei Objekte (Inherits), die beide von Base erben. Die Eigenschaftszuweisung des zweiten Objekts überschreibt den Wert im ersten Objekt.
Irgendwelche Gedanken? Wie man eine korrekte Vererbung so macht, dass die Basisklasse gemeinsame Mitglieder für ihre Nachfahren enthält, aber die Nachkommen können eigene Werte zuweisen, ohne sich gegenseitig zu stören.
%Vor%Base
wird nur einmal aufgerufen. this
-Objekt über Instanzen hinweg, da diese Methoden im Konstruktor erstellt werden (der nur einmal aufgerufen wurde). Function.prototype
) nicht zu modifizieren, wenn Sie mit JavaScript arbeiten, das Sie nicht besitzen. Bitte achten Sie besonders auf die Funktion inherits
und die Zeile ParentClass.call(this, title);
.
Zu suchende Konstruktoren sind ParentClass
und ChildClass
Für diejenigen, die neugierig sind, warum das funktioniert, oder einfach die inherits
Funktion merken.
Wenn eine Eigenschaft auf Instanzebene nicht gefunden wird, versucht JavaScript, die fehlende Eigenschaft zu lösen, indem die Prototypkette der Instanzkonstruktoren durchsucht wird. Wenn die Eigenschaft nicht im ersten Prototypobjekt gefunden wird, wird das übergeordnete Prototypobjekt usw. bis zu Object.prototype
durchsucht. Wenn es nicht in Object.prototype
gefunden werden kann, wird ein Fehler ausgelöst.
Jede Variable, die mit new ChildConstructor
erstellt wird, gibt eine Instanz von ParentConstructor
zurück.
Der ChildConstructor.prototype
wird nicht verwendet.
Nun werden Konstruktor und der Elternkonstruktor entsprechend aufgerufen. Es sind jedoch nur Methoden verfügbar, die in den Konstruktoren definiert sind. Eigenschaften für die übergeordneten Prototypen werden nicht verwendet, da sie noch nicht mit dem Kindkonstruktorprototyp verknüpft sind.
Der übergeordnete Konstruktor wird entweder nur einmal oder zu oft aufgerufen, abhängig davon, ob ParentConstructor.call(this)
verwendet wird oder nicht.
Obwohl dies technisch funktioniert, werden alle Zuordnungen zu ChildConstructor.prototype
auch ParentConstructor.prototype
zugewiesen, da Objekte als Referenz und nicht als Kopie übergeben werden.
Damit können Sie ChildConstructor.prototype
Eigenschaften zuweisen, da es sich um eine Instanz einer temporären anonymen Funktion handelt.
Eigenschaften, die nicht in der Instanz von TempConstructor
gefunden werden, überprüfen dann die Prototypkette der Eigenschaft, sodass Sie den übergeordneten Prototyp erfolgreich geerbt haben. Das einzige Problem ist, dass ChildConstructor.prototype.constructor
jetzt auf TempConstructor
zeigt.
Sie haben erfolgreich von der übergeordneten Klasse geerbt! Mal sehen, ob wir es besser können.
Tags und Links javascript