Javascript Vererbung

8

Ich weiß, dass es viele ähnliche Fragen gibt, die tonnenweise großartige Antworten darauf geben. Ich habe versucht, die klassischen Vererbungsmethoden zu betrachten, oder diese Methoden zum Schließen usw. Irgendwie halte ich sie für mehr oder weniger "Hack" -Methoden, da es nicht wirklich das ist, wofür das Javascript entwickelt wurde. (Willkommen jemand korrigiert mich, wenn ich falsch liege). OK, solange es funktioniert, befriedige ich mit dem klassischen Vererbungsmuster wie:

%Vor%

Oben ist irgendwie, nach meinem Verständnis, die Vererbung von JS. Aber ein Szenario, von dem ich keine Ahnung habe, wie es zu implementieren ist, ist das was, wenn ich während der Objekterzeugung initialisieren möchte (dh innerhalb des Konstruktors), und das neue Objekt sofort verwendet werden kann sei zu klar, also lass mich das folgende C # Psuedo verwenden, um zu erklären, was ich tun möchte:

%Vor%

Aus irgendeinem Grund (wie init. UI-Elemente) scheint es am besten, sie in den Konstruktor zu setzen. Jeder hat eine Idee, wie ich es machen kann.

PS: In der * 1 habe ich keine Ahnung was ich da setzen soll. PS2: Die obige Situation, die ich die jquery.inherit Bibliothek gefunden habe, kann ich tun, ich frage mich nur, ob nicht die Verwendung der Bibliothek es erreichen kann. PS3: Oder mein Verständnis ist falsch. Da Javascript nicht dazu gedacht ist, OOP zu imitieren (deshalb nenne ich es Hack), was ist die "KORREKTE" Logik, um dies zu implementieren.

    
xandy 31.05.2009, 08:44
quelle

5 Antworten

17

Es ist kein Hack als solcher; JavaScript ist eine Prototyp-Sprache, wie von Wikipedia definiert, wo:

  

.. Klassen sind nicht vorhanden, und die Wiederverwendung von Verhalten (bekannt als Vererbung in klassenbasierten Sprachen) erfolgt über einen Prozess des Klonens vorhandener Objekte, die als Prototypen dienen.

Wie bereits erwähnt, werden Klassen in JavaScript nicht verwendet. Jedes Objekt, das Sie erstellen, stammt vom JavaScript Object ; Alle Objekte in JavaScript haben das Objekt prototype , und alle Instanzen der von Ihnen erstellten Objekte "erben" Methoden und Eigenschaften vom Objektobjekt ihres Objekts. Weitere Informationen finden Sie in der MDC Prototyp -Objektreferenz.

Ab diesem Zeitpunkt, wenn Sie die Zeile aufrufen:

%Vor%

Dies ermöglicht dem Objekt CHILDClass , Methoden und Eigenschaften zu seinem Prototyp-Objekt vom Objekt PARENTClass hinzuzufügen, was einen ähnlichen Effekt wie die Idee der Vererbung in klassenbasierten Sprachen erzeugt. Da sich das Objekt prototype auf alle Instanzen dieses Objekts auswirkt, können die Methoden und Eigenschaften des übergeordneten Objekts in jeder Instanz des untergeordneten Objekts vorhanden sein.

Wenn Sie den Konstruktor Ihrer Elternklasse im Konstruktor Ihrer Kindklasse aufrufen wollen, verwenden Sie die Funktion JavaScript call ; Auf diese Weise können Sie den Konstruktor der übergeordneten Klasse im Kontext des Konstruktors der untergeordneten Klasse aufrufen und daher die neu prototypisierten Eigenschaften in der untergeordneten Klasse auf das setzen, was in der übergeordneten Klasse festgelegt ist.

Sie müssen auch nichts hinzufügen, wo Sie *1 angegeben haben, da diese Zeile lediglich dazu dient, dem Prototyp-Objekt der Kindklasse die Methoden und Eigenschaften hinzuzufügen; Beachten Sie jedoch, dass der Konstruktor der übergeordneten Klasse aufgerufen wird. Wenn also Argumente vorhanden sind, die für die Operation des übergeordneten Klassenkonstruktors von grundlegender Bedeutung sind, sollten Sie sicherstellen, dass diese vorhanden sind, um JavaScript-Fehler zu vermeiden.

    
Alex Rozanski 31.05.2009, 09:24
quelle
10

Sie können den übergeordneten Konstruktor im Unterklassenkonstruktor wie folgt manuell aufrufen:

%Vor%

Der Trick besteht darin, die Methode call zu verwenden, mit der Sie eine Methode im Kontext eines anderen Objekts aufrufen können. Weitere Informationen finden Sie in der Dokumentation von call .

    
Ayman Hourieh 31.05.2009 09:01
quelle
1

JavaScript hat keine eingebaute Unterstützung für Vererbungshierarchien, da die Typerweiterung über Aggregation erfolgen soll, dh die gewünschte Funktionalität direkt dem Objekt selbst oder seinem Prototyp hinzufügen, wenn die Eigenschaft zwischen Instanzen geteilt werden soll.

Trotzdem ist JS mächtig genug, um die Implementierung anderer Formen der Objektkonstruktion, einschließlich der klassischen Vererbung, zu ermöglichen.

Eine Clone-Funktion ist vorhanden - das reicht zum Hinzufügen wahre "prototypische Vererbung, und nicht JavaScript-Bastardisierung davon - Ihre Beispiel kann wie folgt implementiert werden:

%Vor%

Es ist auch möglich, etwas syntaktischen Zucker für die klassenbasierte Vererbung hinzuzufügen - meine eigene Implementierung kann hier gefunden werden .

Das obige Beispiel würde dann

lesen %Vor%     
Christoph 31.05.2009 11:27
quelle
1

Ich habe einen einfachen JavaScript-OOP-Wrapper, der eine "klassenähnliche" Vererbung bietet, bei der Sie Basismethoden oder Aufrufbasiskonstruktoren oder -elemente überschreiben können.

Sie definieren Ihre Klassen wie folgt:

%Vor%

Quellcode verfügbar unter: Class.js

Ich habe auch weitere Details in meinem Blogpost über OOP in JavaScript

    
mythz 30.07.2009 19:27
quelle
1

Ich dachte nur, ich würde einige der Probleme mit dem klassischen Muster erwähnen, für das Sie sich einsetzen:

  1. Referenz-Vars für die Super-Klasse (n) stehen im Wesentlichen als Statik für ALLE Instanzen zur Verfügung. Wenn Sie z. B. var arr = [1,2,3] in der Super-Instanz haben und instance_1.arr.push (4) instance_2.arr.push (5) ausführen, werden ALLE diese Instanzen die Änderungen "sehen" / li>
  2. Sie lösen also 1. mit Aymans Lösung, die Zakas "Konstrukteursstehlen" nennt, aber jetzt rufen Sie den Konstruktor zweimal auf: einmal für Ihren Prototyp und einmal für den Konstruktor, der stiehlt. Lösung - für Ihren Prototyp verwenden Sie einen Helfer wie inheritPrototyp (ich habe die gesamte Implementierung in diesem Beitrag gezeigt: Methode "ereritPrototype" ) FWIW, das kam im Wesentlichen von einer Kombination von Seite 181 von Zakas 'Buch und einiger Crockford-Studie.

  3. Keine Privatsphäre (aber andererseits müssten Sie etwas wie das Durable-Objekt-Muster verwenden, um dies zu erhalten, und das ist möglicherweise nicht das, was Sie wollen)

  4. Die Objektdefinition bleibt "dangling": Lösung - Setzen Sie eine if-Anweisung, die auf eine der Funktionen Ihres Prototyps prüft, und definieren Sie dann den Prototyp mit einem Prototyp-Literal.

Ich habe Beispiele für all das auf github !!!

Es war genauso eine Herausforderung für mich, wirklich beides zu lernen: Zakas und Crockford Bücher über Objekterzeugung und Vererbung. Ich musste auch verschiedene JavaScript-TDD-Frameworks ausprobieren. Also entschied ich mich, einen Aufsatz über TDD Frameworks und JavaScript Object Creation & amp; Erbe. Es hat laufenden Code und jspec Tests! Hier ist der Link: * Mein GitHub Open Source Essay / Buch

    
Rob 29.10.2009 04:59
quelle

Tags und Links