Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Klassen
  5. static

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

static

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨März 2016⁩.

Dasstatic Schlüsselwort definiert einestatische Methode oder ein statisches Feld für eine Klasse oder einenstatischen Initialisierungsblock (siehe den Link für weitere Informationen zu dieser Verwendung). Statische Eigenschaften können nicht direkt auf Instanzen der Klasse zugegriffen werden. Stattdessen greift man auf die Klasse selbst zu.

Statische Methoden sind oft Hilfsfunktionen, wie Funktionen um Objekte zu erstellen oder zu klonen, während statische Eigenschaften nützlich sind für Caches, feste Konfigurationen oder andere Daten, die nicht über Instanzen hinweg dupliziert werden müssen.

Hinweis:Im Kontext von Klassen verwendet der Inhalt der MDN Web Docs die Begriffe Eigenschaften undFelder 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

js
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 nichtprototype sein.
  • Der Name eines Klassenfeldes (statisch oder Instanz) kann nichtconstructor sein.

Beschreibung

Diese Seite führt öffentliche statische Eigenschaften von Klassen ein, die statische Methoden, statische Zugriffsfunktionen und statische Felder umfassen.

Öffentliche statische Merkmale werden mit demstatic Schlüsselwort deklariert. Sie werden zur Zeit derKlassenbewertung mit der[[DefineOwnProperty]] Semantik (die im WesentlichenObject.defineProperty() ist) zum Klassenkonstruktor hinzugefügt. Sie werden erneut vom Klassenkonstruktor aus aufgerufen.

Statische Methoden sind oft Hilfsfunktionen, wie Funktionen zur Erstellung oder Klonung von Instanzen. Öffentliche statische Felder sind nützlich, wenn Sie möchten, dass ein Feld nur einmal pro Klasse existiert, nicht bei jeder Klasseninstanz, die Sie erstellen. Dies ist nützlich für Caches, feste Konfigurationen oder andere Daten, die nicht über Instanzen hinweg dupliziert werden müssen.

Statische Feldnamen könnenberechnet werden. Derthis Wert im berechneten Ausdruck ist dasthis, das die Klassendefinition umgibt, und auf den Namen der Klasse zu verweisen ist einReferenceError, da die Klasse noch nicht initialisiert ist.await undyield funktionieren wie erwartet in diesem Ausdruck.

Statische Felder können einen Initialisierer haben. Statische Felder ohne Initialisierer werden aufundefined initialisiert. Öffentliche statische Felder werden bei Unterklassen nicht neu initialisiert, können aber über die Prototypenkette aufgerufen werden.

js
class ClassWithStaticField {  static staticField;  static staticFieldWithInitializer = "static field";}class SubclassWithStaticField extends ClassWithStaticField {  static subStaticField = "subclass field";}console.log(Object.hasOwn(ClassWithStaticField, "staticField")); // trueconsole.log(ClassWithStaticField.staticField); // undefinedconsole.log(ClassWithStaticField.staticFieldWithInitializer); // "static field"console.log(SubclassWithStaticField.staticFieldWithInitializer); // "static field"console.log(SubclassWithStaticField.subStaticField); // "subclass field"

Im Feldinitialisierer bezieht sichthis auf die aktuelle Klasse (auf die Sie auch durch ihren Namen zugreifen können), undsuper bezieht sich auf den Basisklassenkonstruktor.

js
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önnenawait oderyield nicht im Initialisiererausdruck verwenden. (Stellen Sie sich den Initialisiererausdruck als implizit in eine Funktion eingekapselt vor.)

Statische Feldinitialisierer undstatische Initialisierungsblöcke werden nacheinander ausgewertet. Feldinitialisierer können sich auf Feldwerte darüber, aber nicht darunter beziehen. Alle statischen Methoden werden im Voraus hinzugefügt und können aufgerufen werden, obwohl das Aufrufen möglicherweise nicht wie erwartet funktioniert, wenn sie sich auf Felder beziehen, die unter dem initialisierten liegen.

Hinweis:Dies ist wichtiger beiprivaten statischen Feldern, da der Zugriff auf ein nicht initialisiertes privates Feld einenTypeError wirft, selbst wenn das private Feld darunter deklariert ist. (Wenn das private Feld nicht deklariert ist, wäre es ein früherSyntaxError.)

Beispiele

Verwenden von statischen Mitgliedern in Klassen

Das folgende Beispiel demonstriert mehrere Dinge:

  1. Wie ein statisches Mitglied (Methode oder Eigenschaft) in einer Klasse definiert wird.
  2. Dass eine Klasse mit einem statischen Mitglied unterklasseobjektiviert werden kann.
  3. Wie ein statisches Mitglied aufgerufen werden kann und wie nicht.
js
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()); // 3console.log(Triple.calculate(6)); // 18const 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); // undefinedconsole.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'

Aufrufen von statischen Mitgliedern aus einer anderen statischen Methode

Um innerhalb einer anderen statischen Methode derselben Klasse eine statische Methode oder Eigenschaft aufzurufen, können Sie dasthis Schlüsselwort verwenden.

js
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'

Aufrufen von statischen Mitgliedern aus einem Klassenkonstruktor und anderen Methoden

Statische Mitglieder sind nicht direkt mit demthis Schlüsselwort ausnicht-statischen Methoden zugänglich. Sie müssen sie mit dem Klassennamen aufrufen:CLASSNAME.STATIC_METHOD_NAME() /CLASSNAME.STATIC_PROPERTY_NAME oder indem Sie die Methode als Eigenschaft desKonstruktors aufrufen:this.constructor.STATIC_METHOD_NAME() /this.constructor.STATIC_PROPERTY_NAME

js
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

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp