Konstruktoren in Javascript unterscheiden sich auch von denen anderer Sprachen. Jede mit dem Schlüsselwort new aufgerufene Funktion kann als Konstruktor verwendet werden.
Innerhalb des Konstruktorkörpers zeigt dies auf das neu erstellte Objekt. Wenn im Konstruktorkörper kein Rückgabeausdruck angezeigt wird, geben wir standardmäßig diesen zurück, bei dem es sich um das neu erstellte Objekt handelt.
Der obige Code ruft Foo als Konstruktor auf und verweist den Prototyp (__proto__) des neuen Objekts auf Foo.prototype.
Wenn wir den Rückgabeausdruck innerhalb des Konstruktors definieren, gibt der Konstruktor den gesamten Ausdruck zurück, aber dieser Rückgabeausdruck muss ein Objekt sein.
Wenn new weggelassen wird, kann die Funktion kein neues Objekt zurückgeben.
Das obige Beispiel funktioniert möglicherweise auch in einigen Szenarien, aber aufgrund des Funktionsmechanismus in Javascript verweist es auf das globale Objekt.
Werksmodus
Um auf das Schlüsselwort new verzichten zu können, müsste der Konstruktor explizit einen Wert zurückgeben.
Im obigen Beispiel ist der Effekt des Aufrufs der Funktion Bar ohne Verwendung von new derselbe. Ein neu erstelltes Objekt, das die Methode method enthält, ist tatsächlich ein Abschluss.
Hierbei ist zu beachten, dass new Bar() nicht Bar.prototype, sondern das Prototypobjekt der Funktionsmethode innerhalb des Rückgabeausdrucks zurückgibt.
Im obigen Beispiel gibt es keinen funktionalen Unterschied zwischen der Verwendung von new und nicht.
Neue Objekte durch Fabrikmuster erstellen
Wir werden oft daran erinnert, kein neues Produkt zu verwenden, da das Vergessen der Verwendung zu Fehlern führt.
Um ein Objekt zu erstellen, verwenden wir vorzugsweise das Factory-Muster und konstruieren ein neues Objekt innerhalb des Factory-Musters.
var private = 2;
Obj.someMethod = function(value) {
This.value = value;
}
obj.getPrivate = function() {
Rückgabe privat;
}
Rückgabe obj;
}
Obwohl der obige Code weniger fehleranfällig ist als die Verwendung von new und bei der Verwendung privater Variablen praktischer ist, weist er auch einige Nachteile auf:
Da Prototypobjekte nicht gemeinsam genutzt werden können, ist mehr Speicher erforderlich.
Um die Vererbung zu implementieren, muss das Fabrikmuster alle Methoden eines anderen Objekts kopieren oder es als Prototyp eines neuen Objekts verwenden.
Das Aufgeben der Prototypenkette, nur um die Verwendung neuer zu vermeiden, scheint dem Geist der Javascript-Sprache zu widersprechen.
Zusammenfassung
Obwohl die Verwendung von new möglicherweise fehleranfälliger ist, ist dies kein Grund, auf die Verwendung der Prototypenkette zu verzichten. Der endgültige Ansatz hängt von den Anforderungen der Anwendung ab. Der beste Weg ist, einen Stil auszuwählen und dabei zu bleiben.
Einfach ausgedrückt initialisiert der Konstruktor ein Instanzobjekt und das Prototypattribut des Objekts erbt ein Instanzobjekt.