In ES6 sind Klassen syntaktischer Zucker für Konstruktorfunktionen. Wenn eine Klasse ohne das Schlüsselwort new aufgerufen wird, wird keine neue Instanz der Klasse erstellt. Stattdessen wird die Konstruktorfunktion der Klasse direkt aufgerufen.
Betrachten Sie die folgende Klasse:
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
Wenn wir versuchen, diese Klasse ohne das Schlüsselwort new aufzurufen, erhalten wir eine Fehlermeldung:
Cannot call a class as a function
Das liegt daran, dass Klassenkonstruktoren entworfen wurden um neue Instanzen der Klasse zu erstellen. Sie ohne den neuen Operator aufzurufen, entspricht dem Aufruf einer regulären Funktion.
Um den Aufruf eines Klassenkonstruktors ohne das neue Schlüsselwort zu ermöglichen, können wir eine Kombination aus einer Konstruktorfunktion und einer Pfeilfunktion wie folgt verwenden:
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
const FooWithoutNew = () => new Foo(...arguments);
Jetzt können wir den Klassenkonstruktor ohne das Schlüsselwort new aufrufen, indem wir FooWithoutNew verwenden:
FooWithoutNew("world").hello(); // "hello world"
Es ist jedoch wichtig zu beachten, dass dieser Ansatz einige Nachteile hat. Erstens muss eine separate Funktion erstellt werden, was unpraktisch sein kann. Zweitens unterbricht es das Verhalten des Konstruktors, eine neue Instanz zurückzugeben.
Im Allgemeinen wird empfohlen, Klassenkonstruktoren aus Gründen der Klarheit und Konsistenz immer mit dem Schlüsselwort new aufzurufen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3