| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Classes/static | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Mrz 2016 browserbergreifend verfgbar.
Das static Schlsselwort definiert eine statische Methode oder ein statisches Feld fr eine Klasse oder einen statischen Initialisierungsblock (siehe den Link fr weitere Informationen zu dieser Verwendung). Statische Eigenschaften knnen nicht direkt auf Instanzen der Klasse zugegriffen werden. Stattdessen werden sie auf der Klasse selbst aufgerufen.
Statische Methoden sind oft Hilfsfunktionen, wie z.B. Funktionen zum Erstellen oder Klonen von Objekten, whrend statische Eigenschaften ntzlich fr Caches, feste Konfigurationen oder andere Daten sind, die nicht ber Instanzen hinweg repliziert werden mssen.
Hinweis: Im Kontext von Klassen verwenden die MDN Web Docs-Inhalte die Begriffe Eigenschaften und Felder austauschbar.
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."
class ClassWithStatic {
static staticField;
static staticFieldWithInitializer = value;
static staticMethod() {
//
}
}
Es gibt einige zustzliche Syntaxbeschrnkungen:
prototype sein.constructor sein.Diese Seite fhrt ffentliche statische Eigenschaften von Klassen ein, die statische Methoden, statische Zugreifer und statische Felder umfassen.
ffentliche statische Merkmale werden mit dem static Schlsselwort deklariert. Sie werden whrend der Klassenauswertung unter Verwendung der [[DefineOwnProperty]] Semantik (welches im Wesentlichen Object.defineProperty() ist) zum Klassenkonstruktor hinzugefgt. Sie werden erneut vom Klassenkonstruktor aus aufgerufen.
Statische Methoden sind oft Hilfsfunktionen, wie z.B. Funktionen zum Erstellen oder Klonen von Instanzen. ffentliche statische Felder sind ntzlich, wenn Sie mchten, dass ein Feld nur einmal pro Klasse existiert und nicht in jeder Klasseninstanz, die Sie erstellen. Dies ist ntzlich fr Caches, feste Konfigurationen oder andere Daten, die nicht ber Instanzen hinweg repliziert werden mssen.
Statische Feldnamen knnen berechnet werden. Der this Wert im berechneten Ausdruck ist das this der umgebenden Klassendefinition, und das Verweisen auf den Klassennamen fhrt zu einem ReferenceError, da die Klasse noch nicht initialisiert ist. await und yield funktionieren wie erwartet in diesem Ausdruck.
Statische Felder knnen einen Initialisierer haben. Statische Felder ohne Initialisierer werden auf undefined gesetzt. ffentliche statische Felder werden in Unterklassen nicht neu initialisiert, knnen jedoch ber die Prototypenkette aufgerufen 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 (die Sie auch ber ihren Namen aufrufen knnen), 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 knnen await oder yield nicht im Initialisiererausdruck verwenden. (Betrachten Sie den Initialisiererausdruck als implizit in eine Funktion eingewickelt.)
Statische Feldinitialisierer und statische Initialisierungsblcke werden nacheinander ausgewertet. Feldinitialisierer knnen auf Feldwerte oberhalb von ihnen verweisen, aber nicht unterhalb von ihnen. Alle statischen Methoden werden vorher hinzugefgt und knnen aufgerufen werden, obwohl das Aufrufen dieser Methoden mglicherweise nicht wie erwartet funktioniert, wenn sie sich auf unterhalb des beim Initialisieren befindlichen Feldes beziehen.
Hinweis:
Dies ist bei privaten statischen Feldern wichtiger, da der Zugriff auf ein nicht initialisiertes privates Feld einen TypeError auslst, selbst wenn das private Feld unterhalb deklariert wird. (Wenn das private Feld nicht deklariert wird, wre dies ein frher SyntaxError.)
Das folgende Beispiel demonstriert mehrere Dinge:
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'
Um eine statische Methode oder Eigenschaft innerhalb einer anderen statischen Methode derselben Klasse aufzurufen, knnen Sie das this Schlsselwort 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'
Statische Mitglieder sind nicht direkt zugnglich ber das this Schlsselwort aus nicht-statischen Methoden. Sie mssen sie unter Verwendung des Klassennamens aufrufen:
KLASSENNAME.STATISCHE_METHODE() /
KLASSENNAME.STATISCHE_EIGENSCHAFT oder durch Aufruf der Methode als Eigenschaft des constructor: this.constructor.STATISCHE_METHODE() /
this.constructor.STATISCHE_EIGENSCHAFT
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.";
}
}
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-class-definitions |
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |