Ich mache objektorientierte Programmierung in JavaScript ohne Prototype / jQuery (ich benutze jQuery für andere Sachen). Es hat bisher gut funktioniert, aber ich stieß auf ein Problem mit der Vererbung. Wenn ich Objekte in einem Konstruktor deklariere, werden sie grundsätzlich zwischen Instanzen geteilt. Unten ist ein Beispielcode:
%Vor% Dies gibt ein Array [100, 200]
für beide b1
und b2
aus. Was ich will ist, dass b1
und b2
ihre eigenen, separaten Arrays für y
haben. Wie gehe ich hier vor?
(PS. Ich nehme an, dass das Klassensystem von Prototype dafür etwas eingebaut hat. Allerdings würde ich lieber nicht eine Menge meines Codes umschreiben, um dieses Klassensystem zu verwenden)
Ich mache objektorientierte Programmierung in JavaScript ohne Prototype / jQuery (ich benutze jQuery für andere Sachen). Es hat bisher gut funktioniert, aber ich stieß auf ein Problem mit der Vererbung. Wenn ich Objekte in einem Konstruktor deklariere, werden sie grundsätzlich zwischen Instanzen geteilt. Unten ist ein Beispielcode:
%Vor% Dies gibt ein Array A
für beide B
und this.y
aus. Was ich will ist, dass B
und A
ihre eigenen, separaten Arrays für y
haben. Wie gehe ich hier vor?
(PS. Ich nehme an, dass das Klassensystem von Prototype dafür etwas eingebaut hat. Allerdings würde ich lieber nicht eine Menge meines Codes umschreiben, um dieses Klassensystem zu verwenden)
Dies erzeugt nur eine Instanz von A für jedes B.
Sie könnten darüber nachdenken, etw zu tun.
%Vor%Javascript hat KEINE echte Vererbung
Das Problem ist, dass Ihre %code% -Konstruktorfunktion nur einmal für alle %code% -Instanzen ausgeführt wird, und daher ist %code% eine Referenz auf nur ein Array. Jede Referenz von %code% wird über die Prototypkette auf die einzige zentrale %code% Referenz aufgelöst, die nur ein %code% hat. Dies ist eine sehr nützliche Funktion, nur nicht für das, was Sie hier versuchen.
Die Antwort besteht darin, die Konstruktion von der Initialisierung zu trennen; Der Konstruktor richtet zentrale Ressourcen ein und der Initialisierer initialisiert eine Instanz. So wird das Problem von den meisten "Klassen" -Implementierungen behandelt, die ich für JavaScript gesehen habe. Damit das funktioniert, müssen Sie für jede Ebene in der Hierarchie ein Mittel bereitstellen, um den Initialisierer der vorherigen Ebene aufzurufen (was auch für andere Methoden nützlich ist) - z. B. Supercalls.
Supercalls ist der Grund, warum es besser ist, etwas wie Prototype dafür zu verwenden: Sie sind schwer gut zu machen, und es ist sehr leicht, in das "Enkelkind" -Problem zu fallen - eine Lösung das scheint zu funktionieren, aber endet nur mit einer Parent & lt; -Child-Struktur, nicht einer Parent & lt; -Child & lt; -GrandChild-Struktur.
Wenn Sie jedoch Ihren eigenen Vererbungsmechanismus erstellen möchten, diesen Beitrag auf supercalls von meinem pathetisch-anämischen blog kann hilfreich sein, wenn ich auf einige dieser Fragen eingehend eingehe. Es nimmt eine vereinfachte Version des Vererbungsmechanismus von Prototype, dekonstruiert es ein wenig und spricht über eine Möglichkeit, Supercalls zu tun, die einige Probleme mit den aktuellen Supercalls von Prototype nicht haben. Das kann dir dabei helfen, sie in deinem eigenen Mechanismus zu machen.
Tags und Links javascript inheritance