بلوک های اولیه سازی استاتیک

بلوک های اولیه استاتیک یک ویژگی جاوا اسکریپت بسیار جدید است که در ECMAScript 2022 استاندارد شده و فقط در مرورگرهای مدرن پشتیبانی می شود. بلوک‌های مقداردهی اولیه به شما امکان می‌دهند با استفاده از منطقی که چندین عبارت را در بر می‌گیرد، مقدار فیلدهای استاتیک را به صورت پویا تنظیم کنید.

برای ایجاد یک بلوک اولیه استاتیک، از کلمه کلیدی static و به دنبال آن یک دستور بلوک در براکت های فرفری ( {} ) استفاده کنید:

class MyClass {
  static {}
}

این الگو به شما امکان می دهد فیلدهای استاتیک اعلام شده در بدنه کلاس را مقداردهی اولیه یا تغییر دهید:

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

MyClass.secondProperty;
"Second property."

این عبارات در زمانی که یک کلاس برای اولین بار مقدار دهی اولیه می شود، ارزیابی می شوند، یعنی زمانی که موتور جاوا اسکریپت برای اولین بار آن را ارزیابی می کند، نه زمانی که نمونه ای از یک کلاس ایجاد می شود، مانند 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."

درک خود را بررسی کنید

کدام یک از عبارات زیر درست است؟

بلوک های اولیه سازی استاتیک زمانی ارزیابی می شوند که کلاس برای اولین بار مقداردهی اولیه شود.
فیلدهای اعلام شده پس از یک بلوک اولیه سازی استاتیک در داخل بلوک موجود هستند.
یک کلاس فقط می تواند حاوی یک بلوک اولیه استاتیک باشد.