Blocos de inicialização estáticos

Os blocos de inicialização estáticos são um recurso JavaScript muito novo, padronizados em ECMAScript 2022 e compatível apenas com navegadores modernos. Os blocos de inicialização estática permitem definir o valor dos campos estáticos de maneira dinâmica. usando uma lógica que abrange várias instruções.

Para criar um bloco de inicialização estático, use a palavra-chave static seguida de Instrução de bloco com chaves colchetes ({}):

class MyClass {
  static {}
}

Esse padrão permite inicializar ou alterar os campos estáticos declarados no corpo do a classe:

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

MyClass.secondProperty;
"Second property."

Essas instruções são avaliadas quando uma classe é inicializada pela primeira vez, que é quando o mecanismo JavaScript o avalia pela primeira vez, não quando uma instância de um classe é criada, assim como com constructor():

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

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

Uma classe pode conter vários blocos de inicialização estáticos, que são são avaliadas na ordem em que foram declaradas, junto com outros campos estáticos métodos. Isso significa que somente os campos declarados antes de uma inicialização estática estão disponíveis nele:

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

Teste seu conhecimento

Quais das seguintes afirmações são verdadeiras?

Os blocos de inicialização estáticos são avaliados quando a classe pela primeira vez.
Uma classe só pode conter um bloco de inicialização estático.
Campos declarados após um bloco de inicialização estático estar disponíveis dentro do bloco.