新的類別靜態初始化區塊語法讓開發人員可以收集應針對特定類別定義執行一次的程式碼,並將其置於單一位置。考慮以下範例,其中偽亂數產生器使用靜態區塊在評估 class MyPRNG
定義時初始化一次熵池。
class MyPRNG {
constructor(seed) {
if (seed === undefined) {
if (MyPRNG.entropyPool.length === 0) {
throw new Error('Entropy pool exhausted');
}
seed = MyPRNG.entropyPool.pop();
}
this.seed = seed;
}
getRandom() { … }
static entropyPool = [];
static {
for (let i = 0; i < 512; i++) {
this.entropyPool.push(probeEntropySource());
}
}
}
範圍 #
每個靜態初始化區塊都是其自己的 var
和 let
/const
範圍。如同靜態欄位初始化項,靜態區塊中的 this
值是類別建構函式本身。類似地,靜態區塊中的 super.property
參照超類別的靜態屬性。
var y = 'outer y';
class A {
static fieldA = 'A.fieldA';
}
class B extends A {
static fieldB = 'B.fieldB';
static {
let x = super.fieldA;
// → 'A.fieldA'
var y = this.fieldB;
// → 'B.fieldB'
}
}
// Since static blocks are their own `var` scope, `var`s do not hoist!
y;
// → 'outer y'
多個區塊 #
一個類別可以有多個靜態初始化區塊。這些區塊會依文字順序評估。此外,如果存在任何靜態欄位,所有靜態元素都會依文字順序評估。
class C {
static field1 = console.log('field 1');
static {
console.log('static block 1');
}
static field2 = console.log('field 2');
static {
console.log('static block 2');
}
}
// → field 1
// static block 1
// field 2
// static block 2
存取私有欄位 #
由於類別靜態初始化區塊總是巢狀在類別內,因此它可以存取該類別的私有欄位。
let getDPrivateField;
class D {
#privateField;
constructor(v) {
this.#privateField = v;
}
static {
getDPrivateField = (d) => d.#privateField;
}
}
getDPrivateField(new D('private'));
// → private
就這樣。盡情享受物件導向!
類別靜態初始化區塊支援 #
- Chrome: 自版本 91 起支援
- Firefox: 不支援
- Safari: 不支援
- Node.js: 不支援
- Babel: 支援