Statische Klassenmitglieder in JavaScript
Statische Eigenschaften und Methoden in JavaScript: Definition mit dem static-Schlüsselwort, Vererbung, Factory-Methoden, statische Initialisierungsblöcke und this-Verhalten.
Statische Eigenschaften und Methoden gehören zur Klasse selbst, nicht zu den daraus erstellten Instanzen. Das bedeutet, Sie rufen sie direkt über den Klassennamen auf — ohne jemals new zu schreiben. Sie sind das richtige Werkzeug für Hilfsfunktionen und gemeinsame Konstanten, die die Klasse als Ganzes betreffen und nicht ein einzelnes Objekt.
Wenn Sie bereits die eingebauten JavaScript-Objekte verwendet haben, haben Sie statische Mitglieder benutzt, ohne sie als solche zu bezeichnen:
Date.now()gibt den aktuellen Zeitstempel zurück — Sie rufen es aufDateauf, nicht auf einer Datum-Instanz.Array.from(iterable)erstellt ein array — aufgerufen auf derArray-Klasse, nicht auf einem bestehenden array.Object.keys(obj)listet die eigenen Schlüssel eines object auf — aufgerufen aufObject.Math.max(...)undNumber.isInteger(...)sind ebenfalls statisch.
Dieses Kapitel erklärt, wie Sie eigene statische Eigenschaften und Methoden definieren, wie sie von Unterklassen geerbt werden, wie sich this innerhalb von ihnen verhält, und die häufigen Muster (Factory-Methoden und statische Initialisierungsblöcke), auf die Sie im echten Code zurückgreifen werden. Wenn Klassen neu für Sie sind, beginnen Sie zuerst mit grundlegende Klassensyntax.
Statische Eigenschaften und Methoden definieren
Statische Eigenschaften und Methoden werden mit dem Schlüsselwort static innerhalb eines Klassenkörpers definiert. So werden sie definiert und verwendet:
In diesem Beispiel ist pi eine statische Eigenschaft und sum eine statische Methode der Klasse Calculator. Sie können direkt über den Klassennamen aufgerufen werden, ohne die Klasse zu instanziieren.
Hinweis: Die Syntax für statische Klassenfelder (static pi = ...) erfordert ES2022+ oder einen Transpiler wie Babel. Außerdem kann eine statische Methode nicht über this auf die Eigenschaften einer Instanz zugreifen, da sie zur Klasse selbst gehört und nicht zu einer bestimmten Instanz.
this innerhalb einer statischen Methode
Innerhalb einer statischen Methode verweist this auf die Klasse, nicht auf eine Instanz. Dadurch kann eine statische Methode eine andere statische Methode aufrufen oder eine statische Eigenschaft derselben Klasse lesen:
Da this auf die Klasse auflöst, verhält sich dieselbe statische Methode unterschiedlich, je nachdem, über welche Klasse sie aufgerufen wird — ein wichtiges Detail, sobald Vererbung ins Spiel kommt (siehe nächsten Abschnitt).
Vererbung statischer Mitglieder in Unterklassen
Statische Eigenschaften und Methoden werden vererbt. Wenn eine Unterklasse eine Elternklasse mit extends erweitert, erhält sie Zugriff auf die statischen Mitglieder der Elternklasse und kann sie über ihren eigenen Namen aufrufen:
Hier wird Advanced.sum von Calculator geerbt. Innerhalb von Advanced.double ist this gleich Advanced, sodass this.sum(...) sum in der Prototypkette findet.
Da this auf die Klasse zeigt, über die die Methode aufgerufen wurde, kann eine Unterklasse ein statisches Mitglied überschreiben, und die anderen statischen Methoden der Elternklasse verwenden die überschriebene Version, wenn sie über die Unterklasse aufgerufen werden:
Weitere Informationen zur Erweiterung von Klassen finden Sie unter Klassenvererbung.
Statische Factory-Methoden
Ein häufiges Muster ist eine Factory-Methode: eine statische Methode, die eine Instanz der Klasse erstellt und zurückgibt, häufig aus Daten in einer anderen Form. Dies hält die Konstruktionslogik an einem benannten Ort und macht den aufrufenden Code leicht lesbar.
Ein typisches Beispiel ist die Erstellung eines Objekts aus einem JSON-String oder einem einfachen object, das von einer API empfangen wurde:
Die Verwendung von new this(...) statt new User(...) bedeutet, dass eine Unterklasse, die fromJSON aufruft, automatisch eine Instanz der Unterklasse erhält.
Wann statische Eigenschaften verwendet werden sollten
Statische Eigenschaften eignen sich ideal für Konstanten, die mit einer Klasse zusammenhängen und sich unabhängig von der Klasseninstanz nicht ändern. Sie bieten eine Möglichkeit, von überall im Code auf gemeinsame Daten zuzugreifen. Wenn Sie beispielsweise eine Klasse haben, die Benutzerinteraktionen verarbeitet, könnten Sie eine statische Eigenschaft haben, die Standardeinstellungen oder Limits definiert:
Für Konstanten, die von außerhalb der Klasse nie neu zugewiesen werden sollen, erwägen Sie die Kombination von statischen Feldern mit privaten Mitgliedern (static #secret = ...).
Statische Initialisierungsblöcke
Manchmal benötigt eine statische Eigenschaft mehr als einen einzelnen Ausdruck zur Einrichtung — zum Beispiel wenn sie von mehreren anderen Statik-Werten abhängt, eine Schleife erfordert oder ein try/catch benötigt. ES2022 hat statische Initialisierungsblöcke (static { ... }) genau dafür hinzugefügt. Der Block wird einmalig ausgeführt, wenn die Klasse definiert wird, mit this gebunden an die Klasse:
Sie können mehr als einen statischen Block haben, und diese werden in der Reihenfolge des Quellcodes zusammen mit statischen Feld-Initialisierern ausgeführt. Sie sind ideal für berechnetes Setup, das als einzelne Feldzuweisung unhandlich wäre.
Vorteile der Verwendung statischer Eigenschaften und Methoden
- Speichereffizienz: Da statische Eigenschaften und Methoden an die Klasse selbst und nicht an Instanzen gebunden sind, vermeiden sie die Duplizierung von Daten oder Funktionen für jedes Objekt, was den Speicherverbrauch reduzieren kann, wenn viele Instanzen erstellt werden.
- Komfort: Statische Methoden können ohne Instanziierung der Klasse aufgerufen werden, was sie für Hilfsfunktionen praktisch macht.
- Organisierter Code: Indem verwandte Funktionalität direkt als statische Mitglieder innerhalb von Klassen gruppiert wird, bleibt der Code organisiert und funktionale Bereiche sind klar definiert.
Zusammenfassung
- Statische Mitglieder werden mit dem Schlüsselwort
staticdeklariert und leben auf der Klasse, nicht auf Instanzen — rufen Sie sie alsKlassenName.Mitgliedauf. - Bekannte eingebaute Funktionen wie
Date.now(),Array.from()undObject.keys()sind statische Methoden. - Innerhalb einer statischen Methode ist
thisdie Klasse, über die sie aufgerufen wurde. Unterklassen erben statische Mitglieder und können sie überschreiben, undthislöst entsprechend auf. - Verwenden Sie Factory-Methoden (
static fromJSON(...)mitnew this(...)) zur Zentralisierung der Objektkonstruktion und statische Initialisierungsblöcke (static { ... }, ES2022) für Setup, das mehr als einen einzelnen Ausdruck erfordert. - Greifen Sie auf statische Mitglieder für Hilfsprogramme und gemeinsame Konstanten zurück; verwenden Sie reguläre (Instanz-)Methoden für Verhalten, das von den Daten eines bestimmten Objekts abhängt.
Nächste Schritte
- Grundlegende Klassensyntax — die Grundlagen von
class, Konstruktoren und Instanzmethoden. - Klassenvererbung — wie
extendsundsuperfunktionieren, einschließlich mit statischen Mitgliedern. - Private und geschützte Eigenschaften und Methoden — kombinieren Sie
#privatemitstatic, um Daten auf Klassenebene zu schützen.