Heim > Web-Frontend > js-Tutorial > Hauptteil

Können Sie in JavaScript einen Klassenkonstruktor ohne das Schlüsselwort „new' aufrufen?

Barbara Streisand
Freigeben: 2024-10-26 04:12:27
Original
121 Leute haben es durchsucht

 Can You Call a Class Constructor Without the 'new' Keyword in JavaScript?

Aufrufen von Klassenkonstruktoren ohne das Schlüsselwort „new“

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>
Nach dem Login kopieren

Intuitiv könnte man erwarten, dass der folgende Code funktioniert:

<code class="javascript">Foo("world").hello();       // "hello world"</code>
Nach dem Login kopieren

Dieser Versuch schlägt jedoch mit der Fehlermeldung „Eine Klasse kann nicht als Funktion aufgerufen werden“ fehl.

Die Rolle von Klassenkonstruktoren

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.

Weglassen des Schlüsselworts „new“: Lösungen und Kompromisse

Es gibt drei Hauptansätze um diese Einschränkung zu überwinden:

1. Reguläre Funktionen

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>
Nach dem Login kopieren

2. Erzwingen des Schlüsselworts „new“

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>
Nach dem Login kopieren

3. Wrapping-Funktion

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!