חסימות אתחול סטטי

בלוקים של אתחול סטטי הם תכונת JavaScript חדשה מאוד, המבוססת על סטנדרטיזציה של ECMAScript 2022 ונתמך רק ב- דפדפנים מודרניים. בלוקים של אתחול סטטי מאפשרים לכם להגדיר את הערך של שדות סטטיים באופן דינמי, באמצעות לוגיקה שמתפרסת על כמה הצהרות.

כדי ליצור בלוק אתחול סטטי, צריך להשתמש במילת המפתח static ולאחר מכן block Statement בצורה מתולתלת סוגריים מרובעים ({}):

class MyClass {
  static {}
}

הדפוס הזה מאפשר לך לאתחל או לשנות שדות סטטיים שמוצהרים בגוף של הכיתה:

class MyClass {
  static firstProperty = 'First property.';
  static secondProperty;
  static {
    this.secondProperty = 'Second property.';
  }
}

MyClass.secondProperty;
"Second property."

ההצהרות האלה מוערכות בזמן האתחול הראשון של מחלקה, כשמנוע ה-JavaScript מעריך אותו לראשונה, לא כשמופע של המחלקה נוצרת, כמו ב-constructor():

class MyClass {
    static {
        console.log( "Static initialization block." );
    }
    constructor() {
        console.log( "Constructor." );
    }
}
> "Static initialization block."

const myClassInstance = new MyClass();
> "Constructor."

מחלקה יכולה להכיל כמה בלוקים של אתחול סטטי, והבלוקים האלה לפי הסדר שבו הוצהרו, לצד כל שדה סטטי אחר שיטות. כלומר, רק השדות שהוצהרו לפני אתחול סטטי בלוקים זמינים בבלוק הזה:

class MyClass {
  static myNewField;
  static {
    this.myNewField = this.myField;
  }
  static myField = "My value.";
};

MyClass.myNewField;
> undefined

class MyCorrectedClass {
  static myNewField;
  static myField = "My value.";
  static {
    this.myNewField = this.myField;
  }
};

MyCorrectedClass.myNewField;
> "My value."

בדיקת ההבנה

אילו מההצהרות הבאות נכונות?

השדות המוצהרים אחרי בלוק אתחול סטטי זמינים בתוך האוסף.
מחלקה יכולה להכיל רק בלוק אתחול סטטי אחד.
מתבצעת הערכה של בלוקים של אתחול סטטי כשהמחלקה שאותחל לראשונה.