如果你用过 Java
,那你一定对静态初始化代码块不会感到陌生, JavaScript
预计会在 v8 9.1
版本支持这个特性。
新的类静态初始化代码块允许开发人员执行针对某个类定义运行一次的代码,并将它们统一放在一个地方。参考下面的示例,在类 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
属性在静态块中引用父类的静态属性。
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
享受面向对象的快乐吧!
看赞在看支持一下❤️