Heim >Web-Frontend >js-Tutorial >Können Sie in JavaScript einen Klassenkonstruktor ohne das Schlüsselwort „new' aufrufen?
In ES6 stellen Klassen eine prägnante Syntax für Kapselung und Vererbung bereit. Der Aufruf eines Klassenkonstruktors ohne das Schlüsselwort „new“ kann jedoch ein Stolperstein sein.
Betrachten Sie die folgende Klasse:
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; } hello() { return `hello ${this.x}`; } }</code>
Intuitiv könnte man erwarten, dass der folgende Code funktioniert:
<code class="javascript">Foo("world").hello(); // "hello world"</code>
Dieser Versuch schlägt jedoch mit der Fehlermeldung „Eine Klasse kann nicht als Funktion aufgerufen werden“ fehl.
In JavaScript definieren Klassen ein „ Klassenkörper“, der als Konstruktor dient. Dieser Konstruktor wird beim Aufruf der Klasse aufgerufen und erstellt eine Instanz der Klasse. Daher ist es wichtig, das Schlüsselwort „new“ zu verwenden, um den Konstruktor zu starten und ein neues Objekt zu erstellen.
Es gibt drei Hauptansätze um diese Einschränkung zu überwinden:
Anstatt eine Klasse zu verwenden, kann man eine reguläre Funktion definieren, die sich ähnlich verhält.
<code class="javascript">function Foo(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; this.hello = function() { return this.x; } }</code>
Um sicherzustellen, dass die Klasse immer mit dem Schlüsselwort „new“ aufgerufen wird, kann man eine Prüfung im Konstruktor implementieren:
<code class="javascript">class Foo { constructor(x) { if (!(this instanceof Foo)) throw new Error("Class must be invoked with 'new'"); this.x = x; } hello() { return `hello ${this.x}`; } }</code>
Durch das Einschließen der Klasse in eine reguläre Funktion wird es möglich, sie sowohl mit als auch ohne das Schlüsselwort „new“ aufzurufen.
<code class="javascript">class Foo { constructor(x) { this.x = x; } hello() { return `hello ${this.x}`; } } var _old = Foo; Foo = function(...args) { return new _old(...args) };</code>
Jede Lösung weist ihre eigenen Kompromisse auf . Regulären Funktionen fehlen die Kapselungs- und Vererbungsvorteile von Klassen, während das erzwungene Schlüsselwort „new“ in bestimmten Szenarien die Flexibilität einschränken kann. Der Wrapping-Funktionsansatz schafft ein Gleichgewicht zwischen beiden Optionen.
Das obige ist der detaillierte Inhalt vonKönnen Sie in JavaScript einen Klassenkonstruktor ohne das Schlüsselwort „new' aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!