Statik başlatma blokları

Statik başlatma blokları, ECMAScript 2022'de standartlaştırılmış ve yalnızca modern tarayıcılarda desteklenen yeni bir JavaScript özelliğidir. Statik başlatma blokları, birden çok ifadeyi kapsayan mantık kullanarak statik alanların değerini dinamik olarak ayarlamanızı sağlar.

Statik başlatma bloğu oluşturmak için static anahtar kelimesini ve ardından kıvrık ayraç ({}) içinde bir blok ifadesi kullanın:

class MyClass {
  static {}
}

Bu kalıp, sınıfın gövdesinde tanımlanan statik alanları başlatmanıza veya değiştirmenize olanak tanır:

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

MyClass.secondProperty;
"Second property."

Bu ifadeler, constructor()'de olduğu gibi bir sınıfın bir örneği oluşturulduğunda değil, sınıfın ilk başlatıldığı anda, yani JavaScript motoru tarafından ilk kez değerlendirildiğinde değerlendirilir:

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

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

Bir sınıf birden fazla statik başlatma bloğu içerebilir. Bu bloklar, diğer statik alanlar ve yöntemlerle birlikte bildirildikleri sırayla değerlendirilir. Bu, o blokta yalnızca bir statik başlatma bloğundan önce tanımlanan alanların kullanılabileceği anlamına gelir:

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."

Öğrendiklerinizi sınayın

Aşağıdaki ifadelerden hangisi doğrudur?

Statik başlatma blokları, sınıfın ilk kullanıma hazırlanması sırasında değerlendirilir.
Bir sınıf yalnızca bir statik başlatma bloğu içerebilir.
Statik başlatma bloğundan sonra tanımlanan alanlar blokun içinde bulunur.