рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ

рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ, JavaScript рдХреА рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ. рдЗрд╕реЗ ECMAScript 2022 рдФрд░ рд╕рд┐рд░реНрдлрд╝ рдЗрдирдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдореЙрдбрд░реНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реЛ. рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреА рдорджрдж рд╕реЗ, рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреА рд╡реИрд▓реНрдпреВ рдбрд╛рдЗрдиреИрдорд┐рдХ рддреМрд░ рдкрд░ рд╕реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЙрдЬрд┐рдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ.

рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, static рдХреАрд╡рд░реНрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдХрд░реНрд▓реА рдореЗрдВ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмреНрд░реИрдХреЗрдЯ ({}):

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

рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рддрдирд╛ рд╕рдордЭ рдЖрдпрд╛ рд╣реИ

рдЗрдирдореЗрдВ рд╕реЗ рдХреМрдирд╕реА рдмрд╛рддреЗрдВ рд╕рд╣реА рд╣реИрдВ?

рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд▓рди рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдХреНрд▓рд╛рд╕ рдкрд╣рд▓реА рдмрд╛рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛.
рдХрд┐рд╕реА рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.
рд╕реНрдЯреИрдЯрд┐рдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рддрдп рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.