Suche über das Internet stoße ich immer auf diesen Ansatz der Javascript Klassen Erweiterung
%Vor%Aber wie unterscheidet sich das von diesem?
%Vor% Dieser letzte funktioniert auch perfekt. Also warum sollte ich dann diese zusätzliche var F = function() { }
move benutzen?
Das direkte Aufrufen des ursprünglichen Konstruktors kann unerwünschte Nebenwirkungen haben, z. B. wenn bestimmte erwartete Argumente nicht übergeben werden.
Aus diesem Grund verwenden sie eine "Proxy" -Funktion, mit der Sie ein neues Objekt erhalten, das von Parent()
erbt, ohne tatsächlich Parent()
aufzurufen.
Hier ist ein einfaches Beispiel:
%Vor% Wenn Person
das übergeordnete Element ist, wird ein Fehler ausgegeben, da kein name
übergeben wurde.
Das erste Beispiel ist (wie im Kommentar erwähnt) ein Shim für den folgenden Code, der leichter zu verstehen ist.:
%Vor%Im Wesentlichen macht diese Implementierung das Objekt, von dem alle untergeordneten Child-Instanzen (Child.prototype) erben, von dem Objekt, von dem alle übergeordneten Instanzen erben (Parent.prototype). Intuitiv ist dies die genaueste Darstellung der Klassenvererbung, die JavaScript bietet.
Die zweite Implementierung von extends ist fehlerhaft, da alle Child-Instanzen von einer bestimmten Parent-Instanz erben. Wenn es signifikante Unterschiede zwischen den übergeordneten Instanzen gibt (aufgrund der zum Beispiel an den Konstruktor übergebenen Parameter), können die Child-Instanzen dies nicht genau darstellen, da sie alle von einer übergeordneten Instanz erben, die durch Aufruf des Parent-Konstruktors ohne Argumente erstellt wurde. p>
Hier ist ein Beispiel, was die erste Implementierung tun kann und das zweite nicht:
%Vor% Als Nebenbemerkung habe ich im Child-Konstruktor den Parent-Konstruktor aufgerufen. Dies ist tatsächlich ziemlich üblich, wenn es um klassische Vererbung geht, das ist ein weiterer Punkt für die erste Implementierung. Es ist nicht wirklich erforderlich, der Child-Konstruktor kann den Aufruf des Parent-Konstruktors jedoch ignorieren. Beachten Sie jedoch, dass dieser Aufruf grundsätzlich dafür sorgt, dass das erstellte neue Objekt eine gültige Parent-Instanz ist, bevor es eine Child-Instanz ist. Wenn Sie in meinem Beispiel den Parent-Konstruktor nicht aufrufen würden, würden die Eigenschaften name und age für die Child-Instanz nicht festgelegt. Die Methode greet würde also I am child undefined and i'm undefined
zurückgeben, weit entfernt von dem, was Sie erwarten würden.
Es lohnt sich, die verschiedenen Möglichkeiten zu untersuchen, wie Sie Bits zu einem Objekt in JavaScript erweitern und hinzufügen können.
Konstruktoren verwenden (Funktion (global) { Funktion SuperClass () {}
%Vor%Verwenden von object.create (keine doppelte Instanziierung) - Wird nicht von allen Browsern unterstützt.
%Vor%Funktionelle Mixins: Wenn Sie eine generische Gruppe von Methoden / Eigenschaften in ein Objekt mischen möchten.
%Vor%Eine sehr gute Detailerklärung aller Methoden:
Tags und Links javascript prototype