| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Classes/Static_initialization_blocks | [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 2023 browserbergreifend verfgbar.
Statische Initialisierungsblcke werden innerhalb einer Klasse deklariert. Sie enthalten Anweisungen, die whrend der Klasseninitialisierung ausgewertet werden. Dies ermglicht flexiblere Initialisierungslogik als statische Eigenschaften, wie z.B. die Verwendung von try...catch oder das Setzen mehrerer Felder aus einem einzigen Wert. Die Initialisierung erfolgt im Kontext der aktuellen Klassendeklaration mit Zugriff auf privaten Zustand, was es der Klasse erlaubt, Informationen ihrer privaten Elemente mit anderen Klassen oder Funktionen zu teilen, die im selben Gltigkeitsbereich deklariert sind (analog zu "friend"-Klassen in C++).
class ClassWithStaticInitializationBlock {
static staticProperty1 = "Property 1";
static staticProperty2;
static {
this.staticProperty2 = "Property 2";
}
}
console.log(ClassWithStaticInitializationBlock.staticProperty1);
// Expected output: "Property 1"
console.log(ClassWithStaticInitializationBlock.staticProperty2);
// Expected output: "Property 2"
class ClassWithSIB {
static {
//
}
}
Ohne statische Initialisierungsblcke knnte eine komplexe statische Initialisierung durch den Aufruf einer statischen Methode nach der Klassendeklaration erreicht werden:
class MyClass {
static init() {
// Access to private static fields is allowed here
}
}
MyClass.init();
Jedoch offenbart dieser Ansatz ein Implementierungsdetail (die init()-Methode) dem Nutzer der Klasse. Andererseits hat jede auerhalb der Klasse deklarierte Initialisierungslogik keinen Zugriff auf private statische Felder. Statische Initialisierungsblcke erlauben es, beliebige Initialisierungslogik innerhalb der Klasse zu deklarieren und auszufhren, whrend die Klasse ausgewertet wird.
Eine Klasse kann beliebig viele static {}-Initialisierungsblcke in ihrem Klassenkrper haben.
Diese werden zusammen mit allen dazwischenliegenden statischen Feldinitialisierern in der Reihenfolge ausgewertet, in der sie deklariert sind.
Jede statische Initialisierung einer Superklasse wird zuerst durchgefhrt, vor der ihrer Unterklassen.
Der Gltigkeitsbereich der innerhalb des statischen Blocks deklarierten Variablen ist lokal fr den Block. Dies schliet var, function, const und let Deklarationen ein. var Deklarationen werden nicht aus dem statischen Block herausgehoben.
var y = "Outer y";
class A {
static field = "Inner y";
static {
// var y only hoisted inside block
console.log(y); // undefined <-- not 'Outer y'
var y = this.field;
}
}
// var y defined in static block is not hoisted
// outside the block
console.log(y); // 'Outer y'
Das this innerhalb eines statischen Blocks bezieht sich auf das Konstruktorobjekt der Klasse.
super.property kann verwendet werden, um auf statische Eigenschaften der Superklasse zuzugreifen.
Es ist jedoch ein Syntaxfehler, super() in einem statischen Initialisierungsblock einer Klasse zu rufen oder das arguments-Objekt zu verwenden.
Die Anweisungen werden synchron ausgewertet. Sie knnen await oder yield in diesem Block nicht verwenden. (Stellen Sie sich die Initialisierungsanweisungen als implizit in eine Funktion eingerahmt vor.)
Der Gltigkeitsbereich des statischen Blocks ist innerhalb des lexikalischen Gltigkeitsbereichs des Klassenkrpers verschachtelt und kann auf private Namen zugreifen, die innerhalb der Klasse deklariert sind, ohne dass ein Syntaxfehler entsteht.
Statische Felder-Initialisierer und statische Initialisierungsblcke werden nacheinander ausgewertet. Der Initialisierungsblock kann auf Feldwerte ber ihm, aber nicht unter ihm verweisen. Alle statischen Methoden werden vorher hinzugefgt und knnen aufgerufen werden, obwohl ihr Verhalten mglicherweise nicht wie erwartet ist, wenn sie auf Felder unterhalb des aktuellen Blocks verweisen.
Hinweis:
Dies ist wichtiger bei privaten statischen Feldern, da der Zugriff auf ein nicht initialisiertes privates Feld einen TypeError verursacht, selbst wenn das private Feld darunter deklariert ist. (Wird das private Feld nicht deklariert, wre es ein frher SyntaxError.)
Ein statischer Initialisierungsblock darf keine Dekoratoren haben (die Klasse selbst darf).
Der folgende Code demonstriert eine Klasse mit statischen Initialisierungsblcken und dazwischenliegenden statischen Feldinitialisierern. Die Ausgabe zeigt, dass die Blcke und Felder in Ausfhrungsreihenfolge ausgewertet werden.
class MyClass {
static field1 = console.log("static field1");
static {
console.log("static block1");
}
static field2 = console.log("static field2");
static {
console.log("static block2");
}
}
// 'static field1'
// 'static block1'
// 'static field2'
// 'static block2'
Beachten Sie, dass jede statische Initialisierung einer Superklasse zuerst durchgefhrt wird, bevor die ihrer Unterklassen erfolgt.
Das this innerhalb eines statischen Blocks bezieht sich auf das Konstruktorobjekt der Klasse.
Dieser Code zeigt, wie auf ein ffentliches statisches Feld zugegriffen werden kann.
class A {
static field = "static field";
static {
console.log(this.field);
}
}
// 'static field'
Die super.property-Syntax kann innerhalb eines static-Blocks verwendet werden, um auf statische Eigenschaften einer Superklasse zu verweisen.
class A {
static field = "static field";
}
class B extends A {
static {
console.log(super.field);
}
}
// 'static field'
Das untenstehende Beispiel zeigt, wie der Zugriff auf ein privates Instanzfeld einer Klasse aus einem Objekt auerhalb der Klasse gewhrt werden kann (Beispiel vom v8.dev blog):
let getDPrivateField;
class D {
#privateField;
constructor(v) {
this.#privateField = v;
}
static {
getDPrivateField = (d) => d.#privateField;
}
}
console.log(getDPrivateField(new D("private"))); // 'private'
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # prod-ClassStaticBlock |
staticclassDer 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 |