static
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2016.
* Some parts of this feature may have varying levels of support.
Das static
Schlüsselwort definiert eine statische Methode oder ein statisches Feld für eine Klasse oder einen statischen Initialisierungsblock (siehe den Link für mehr Informationen über diese Verwendung). Statische Eigenschaften können nicht direkt auf Instanzen der Klasse zugegriffen werden. Stattdessen werden sie auf die Klasse selbst zugegriffen.
Statische Methoden sind oft Hilfsfunktionen, wie Funktionen zum Erstellen oder Klonen von Objekten, während statische Eigenschaften nützlich für Caches, feste Konfigurationen oder andere Daten sind, die nicht über Instanzen hinweg repliziert werden müssen.
Hinweis: Im Kontext von Klassen verwenden die MDN-Web-Dokumente die Begriffe Eigenschaften und Felder austauschbar.
Probieren Sie es aus
class ClassWithStaticMethod {
static staticProperty = "someValue";
static staticMethod() {
return "static method has been called.";
}
static {
console.log("Class static initialization block called");
}
}
console.log(ClassWithStaticMethod.staticProperty);
// Expected output: "someValue"
console.log(ClassWithStaticMethod.staticMethod());
// Expected output: "static method has been called."
Syntax
class ClassWithStatic {
static staticField;
static staticFieldWithInitializer = value;
static staticMethod() {
// …
}
}
Es gibt einige zusätzliche Syntaxeinschränkungen:
- Der Name einer statischen Eigenschaft (Feld oder Methode) kann nicht
prototype
sein. - Der Name eines Klassenfeldes (statisch oder Instanz) kann nicht
constructor
sein.
Beschreibung
Diese Seite führt öffentliche statische Eigenschaften von Klassen ein, die statische Methoden, statische Zugriffsbegrenzer und statische Felder umfassen.
- Für private statische Merkmale siehe private Elemente.
- Für Instanzmerkmale siehe Methodendefinitionen, getter, setter und öffentliche Klassenfelder.
Öffentliche statische Merkmale werden mit dem static
Schlüsselwort deklariert. Sie werden dem Klassenkonstruktor zum Zeitpunkt der Klassenbewertung unter Verwendung der [[DefineOwnProperty]]
Semantik hinzugefügt (was im Wesentlichen Object.defineProperty()
ist). Sie werden erneut vom Klassenkonstruktor zugegriffen.
Statische Methoden sind oft Hilfsfunktionen, wie Funktionen, um Instanzen zu erstellen oder zu klonen. Öffentliche statische Felder sind nützlich, wenn Sie möchten, dass ein Feld nur einmal pro Klasse existiert, nicht bei jeder erstellten Klasseninstanz. Dies ist nützlich für Caches, feste Konfigurationen oder andere Daten, die nicht über Instanzen hinweg repliziert werden müssen.
Statische Feldnamen können berechnet werden. Der this
Wert im berechneten Ausdruck ist das this
umgebende die Klassendefinition, und die Referenz auf den Klassennamen ist ein ReferenceError
, da die Klasse noch nicht initialisiert ist. await
und yield
funktionieren wie erwartet in diesem Ausdruck.
Statische Felder können einen Initialisierer haben. Statische Felder ohne Initialisierer werden auf undefined
initialisiert. Öffentliche statische Felder werden nicht bei Unterklassen neu initialisiert, können jedoch über die Prototypkette zugegriffen werden.
class ClassWithStaticField {
static staticField;
static staticFieldWithInitializer = "static field";
}
class SubclassWithStaticField extends ClassWithStaticField {
static subStaticField = "subclass field";
}
console.log(Object.hasOwn(ClassWithStaticField, "staticField")); // true
console.log(ClassWithStaticField.staticField); // undefined
console.log(ClassWithStaticField.staticFieldWithInitializer); // "static field"
console.log(SubclassWithStaticField.staticFieldWithInitializer); // "static field"
console.log(SubclassWithStaticField.subStaticField); // "subclass field"
Im Feldinitialisierer bezieht sich this
auf die aktuelle Klasse (auf die Sie auch über ihren Namen zugreifen können), und super
bezieht sich auf den Basisklassenkonstruktor.
class ClassWithStaticField {
static baseStaticField = "base static field";
static anotherBaseStaticField = this.baseStaticField;
static baseStaticMethod() {
return "base static method output";
}
}
class SubClassWithStaticField extends ClassWithStaticField {
static subStaticField = super.baseStaticMethod();
}
console.log(ClassWithStaticField.anotherBaseStaticField); // "base static field"
console.log(SubClassWithStaticField.subStaticField); // "base static method output"
Der Ausdruck wird synchron ausgewertet. Sie können nicht await
oder yield
im Initialisiererausdruck verwenden. (Denken Sie an den Initialisiererausdruck als implizit in einer Funktion eingeschlossen.)
Statische Feldinitialisierer und statische Initialisierungsblöcke werden nacheinander ausgewertet. Feldinitialisierer können sich auf Feldwerte darüber beziehen, aber nicht darunter. Alle statischen Methoden werden vorher hinzugefügt und können zugegriffen werden, obwohl deren Aufruf möglicherweise nicht wie erwartet verhält, wenn sie sich auf Felder darunter beziehen, die initialisiert werden.
Hinweis:
Dies ist wichtiger bei privaten statischen Feldern, da der Zugriff auf ein nicht initialisiertes privates Feld einen TypeError
wirft, selbst wenn das private Feld darunter deklariert wird. (Wenn das private Feld nicht deklariert ist, wäre es ein früher SyntaxError
.)
Beispiele
Verwenden statischer Mitglieder in Klassen
Das folgende Beispiel demonstriert mehrere Dinge:
- Wie ein statisches Mitglied (Methode oder Eigenschaft) in einer Klasse definiert wird.
- Dass eine Klasse mit einem statischen Mitglied unterklassifiziert werden kann.
- Wie ein statisches Mitglied aufgerufen werden kann und nicht kann.
class Triple {
static customName = "Tripler";
static description = "I triple any number you provide";
static calculate(n = 1) {
return n * 3;
}
}
class SquaredTriple extends Triple {
static longDescription;
static description = "I square the triple of any number you provide";
static calculate(n) {
return super.calculate(n) * super.calculate(n);
}
}
console.log(Triple.description); // 'I triple any number you provide'
console.log(Triple.calculate()); // 3
console.log(Triple.calculate(6)); // 18
const tp = new Triple();
console.log(SquaredTriple.calculate(3)); // 81 (not affected by parent's instantiation)
console.log(SquaredTriple.description); // 'I square the triple of any number you provide'
console.log(SquaredTriple.longDescription); // undefined
console.log(SquaredTriple.customName); // 'Tripler'
// This throws because calculate() is a static member, not an instance member.
console.log(tp.calculate()); // 'tp.calculate is not a function'
Aufruf statischer Mitglieder von einer anderen statischen Methode
Um eine statische Methode oder Eigenschaft innerhalb einer anderen statischen Methode derselben Klasse aufzurufen, können Sie das this
Schlüsselwort verwenden.
class StaticMethodCall {
static staticProperty = "static property";
static staticMethod() {
return `Static method and ${this.staticProperty} has been called`;
}
static anotherStaticMethod() {
return `${this.staticMethod()} from another static method`;
}
}
StaticMethodCall.staticMethod();
// 'Static method and static property has been called'
StaticMethodCall.anotherStaticMethod();
// 'Static method and static property has been called from another static method'
Aufruf statischer Mitglieder von einem Klassenkonstruktor und anderen Methoden
Statische Mitglieder sind nicht direkt zugänglich unter Verwendung des this
Schlüsselworts von nicht-statischen Methoden. Sie müssen sie mit dem Klassennamen aufrufen: CLASSNAME.STATIC_METHOD_NAME()
/ CLASSNAME.STATIC_PROPERTY_NAME
oder indem Sie die Methode als Eigenschaft des constructor
aufrufen: this.constructor.STATIC_METHOD_NAME()
/ this.constructor.STATIC_PROPERTY_NAME
class StaticMethodCall {
constructor() {
console.log(StaticMethodCall.staticProperty); // 'static property'
console.log(this.constructor.staticProperty); // 'static property'
console.log(StaticMethodCall.staticMethod()); // 'static method has been called.'
console.log(this.constructor.staticMethod()); // 'static method has been called.'
}
static staticProperty = "static property";
static staticMethod() {
return "static method has been called.";
}
}
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-class-definitions |