前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「V8 9.1」新增类静态初始化代码块

「V8 9.1」新增类静态初始化代码块

作者头像
ConardLi
发布2021-04-07 15:05:35
5390
发布2021-04-07 15:05:35
举报
文章被收录于专栏:code秘密花园code秘密花园

如果你用过 Java ,那你一定对静态初始化代码块不会感到陌生, JavaScript 预计会在 v8 9.1 版本支持这个特性。

新的类静态初始化代码块允许开发人员执行针对某个类定义运行一次的代码,并将它们统一放在一个地方。参考下面的示例,在类 MyPRNG 定义时,在静态初始化代码块中会创建一个随机字符串数组。

代码语言:javascript
复制
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());
        }
    }
}

作用域

每个静态初始化代码都有自己的 varlet/const 作用域。与静态字段初始化器一样,静态代码块中的 this 值是类构造函数本身。同样, super 属性在静态块中引用父类的静态属性。

代码语言:javascript
复制
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'

多个代码块

一个类可以有多个静态初始化代码块。这些代码块按顺序执行。此外,如果有任何静态字段,所有静态元素都按顺序执行。

代码语言:javascript
复制
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

访问私有属性

因为类静态初始化代码块总是嵌套在类的内部,所以它可以访问该类的私有字段。

代码语言:javascript
复制
let getDPrivateField;
class D {
    #privateField;
    constructor(v) {
        this.#privateField = v;
    }
    static {
        getDPrivateField = (d) => d.#privateField;
    }
}
getDPrivateField(new D('private'));
// → private

享受面向对象的快乐吧!

看赞在看支持一下❤️

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作用域
  • 多个代码块
  • 访问私有属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档