Bloques de inicialización estáticos

Los bloques de inicialización estática son una función de JavaScript muy nueva, estandarizada en ECMAScript 2022 y solo es compatible con navegadores modernos. Los bloques de inicialización estática permiten establecer el valor de los campos estáticos de forma dinámica. con una lógica que abarca múltiples sentencias.

Para crear un bloque de inicialización estático, usa la palabra clave static seguida de un instrucción de bloqueo en formato rizado corchetes ({}):

class MyClass {
  static {}
}

Este patrón te permite inicializar o modificar campos estáticos declarados en el cuerpo de la clase:

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

MyClass.secondProperty;
"Second property."

Estas instrucciones se evalúan en el momento en que una clase se inicializa por primera vez, de es cuando el motor de JavaScript la evalúa por primera vez, no cuando una instancia de un al igual que con constructor():

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

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

Una clase puede contener varios bloques de inicialización estática, que se evalúen en el orden en que estén declarados, junto con cualquier otro campo estático y . Esto significa que solo los campos declarados antes de una inicialización estática están disponibles en ese bloque:

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

Verifica tus conocimientos

¿Cuáles de las siguientes afirmaciones son verdaderas?

Los bloques de inicialización estática se evalúan cuando la clase se se inicializan por primera vez.
Una clase solo puede contener un bloque de inicialización estático.
Los campos declarados después de un bloque de inicialización estática están disponibles dentro del bloque.