专栏首页code秘密花园「V8 9.1」新增类静态初始化代码块

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

如果你用过 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());
        }
    }
}

作用域

每个静态初始化代码都有自己的 varlet/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

享受面向对象的快乐吧!

看赞在看支持一下❤️

本文分享自微信公众号 - code秘密花园(code_mmhy),作者:ConardLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浏览器是如何工作的:Chrome V8让你更懂JavaScript

    V8 是由 Google 开发的开源 JavaScript 引擎,也被称为虚拟机,模拟实际计算机各种功能来实现代码的编译和执行。

    coder_koala
  • 浏览器是如何工作的:Chrome V8让你更懂JavaScript

    V8 是由 Google 开发的开源 JavaScript 引擎,也被称为虚拟机,模拟实际计算机各种功能来实现代码的编译和执行。

    ConardLi
  • 浏览器是如何工作的:Chrome V8 让你更懂 JavaScript

    V8 是由 Google 开发的开源 JavaScript 引擎,也被称为虚拟机,模拟实际计算机各种功能来实现代码的编译和执行。

    五月君
  • 解读 V8 GC Log(二): 堆内外内存的划分与 GC 算法

    上一篇文章介绍了理解 V8 GC Log 的意义在哪,简单介绍了一下 V8 GC 的整体特征。在这篇文章里,我们介绍 V8 中堆内存的划分与新老生代的 GC 算...

    五月君
  • C++协程库与嵌入V8的兼容性问题

    C++ 中使用了部门自研的有一定历史的 RPC 框架,所绑定的协程库是 GNU pth。

    h46incon
  • Node.js为什么需要C++扩展?

    这些 C++扩展(xxx.node文件)也能像 JS 模块一样直接require使用,因为Node 模块加载机制提供了原生支持

    ayqy贾杰
  • JavaScript是如何工作的:深入V8引擎&编写优化代码的5个技巧

    JavaScript 引擎是执行 JavaScript 代码的程序或解释器。JavaScript 引擎可以实现为标准解释器,或者以某种形式将 JavaScrip...

    Javanx
  • JavaScript的工作原理:V8引擎内部机制及优化代码的5个技巧 [每日前端夜话(0x15)]

    几个星期前,我们开始了一系列旨在深入挖掘 JavaScript 及其工作原理的系列:通过了解JavaScript的构建模块以及它们如何共同发挥作用,你将能够编写...

    疯狂的技术宅
  • 精读《Deno 2020 官方回顾及 2021 展望》

    原文地址:Deno in 2020 原文作者:Bartek Iwańczuk, Ryan Dahl 译者:@hylerrix 原文发布时间/翻译时间:202...

    腾讯VTeam技术团队

扫码关注云+社区

领取腾讯云代金券