Javascript-Prototyp-Vererbung - Nachkommen überschreiben sich gegenseitig

8

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%     
Max 28.01.2013, 14:25
quelle

1 Antwort

28

Problem (e)

  • Der Konstruktor Base wird nur einmal aufgerufen.
    this.prototype = new baseClass;
  • Privilegierte Methoden verweisen auf das gleiche this -Objekt über Instanzen hinweg, da diese Methoden im Konstruktor erstellt werden (der nur einmal aufgerufen wurde).

Problem (e) basierend auf einer Frage der Meinung

  • Sie sollten versuchen, native Prototypen (zB Function.prototype ) nicht zu modifizieren, wenn Sie mit JavaScript arbeiten, das Sie nicht besitzen.

Lösung

  • Rufen Sie den Konstruktor und den Elternkonstruktor für jede neue Instanz auf, die erstellt wird.
  • Übernehmen Sie die übergeordnete Prototypkette (keine Instanz der übergeordneten Klasse).
  • Pflegen Sie ein Verhältnis von 1: 1 der Anzahl der erstellten Instanzen zur Anzahl der Aufrufe des Konstruktors in der Prototypkette.

Endgültige Lösung für das Problem von Max

Bitte achten Sie besonders auf die Funktion inherits und die Zeile ParentClass.call(this, title); . Zu suchende Konstruktoren sind ParentClass und ChildClass

%Vor%

Runter ins Kaninchenloch

Für diejenigen, die neugierig sind, warum das funktioniert, oder einfach die inherits Funktion merken.

Wie Eigenschaften mithilfe der Prototypkette aufgelöst werden

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.

Aufruf des Elternkonstruktors vom Kindkonstruktor: Versuch # 1

%Vor%

Jede Variable, die mit new ChildConstructor erstellt wird, gibt eine Instanz von ParentConstructor zurück. Der ChildConstructor.prototype wird nicht verwendet.

Aufruf des Elternkonstruktors vom Kindkonstruktor: Versuch # 2

%Vor%

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.

Erben des Elternprototyps: Versuch # 1

%Vor%

Der übergeordnete Konstruktor wird entweder nur einmal oder zu oft aufgerufen, abhängig davon, ob ParentConstructor.call(this) verwendet wird oder nicht.

Erben des Elternprototyps Versuch # 2

%Vor%

Obwohl dies technisch funktioniert, werden alle Zuordnungen zu ChildConstructor.prototype auch ParentConstructor.prototype zugewiesen, da Objekte als Referenz und nicht als Kopie übergeben werden.

Erben des Elternprototyps Versuch # 3

%Vor%

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.

Erben des Elternprototyps Versuch # 4

%Vor%

Alles zusammen

%Vor%

Sie haben erfolgreich von der übergeordneten Klasse geerbt! Mal sehen, ob wir es besser können.

Die vererbt Funktion

%Vor%     
goofyguy763 29.01.2013, 05:30
quelle

Tags und Links