JavaScript 和 TypeScript 的封装性 —— 私有成员

JavaScript 使用了基于原型模式的 OOP 实现,一直以来,其封装性都不太友好。为此,TypeScript 在对 JavaScript 类型进行增强的同时,特别关注了“类”定义。TS 的类定义起来更接近于 Java 和 C# 的语法,还允许使用 privateprotectedpublic 访问修饰符声明成员访问限制,并在编译期进行检查。

显然 ECMAScript 受到启发,在 ES2015 中引入了新的类定义语法,并开始思考成员访问限制的问题,提出了基于 Symbol 和闭包私有成员定义方案,当然这个方案使用起来并不太能被接受。又经过长达 4 年思考、设计和讨论,最终在 ES2019 中发布了使用 # 号来定义私有成员的规范。Chrome 74<sup>+</sup> 和 Node 12<sup>+</sup> 已经实现了该私有成员定义的规范。

JavaScript 和 ECMAScript 有什么关系?

ECMAScript 由 ECMA-262 标准定义,是一个语言规范(Specification);JavaScript 是该规范的一个实现。拿上面的问题去搜索引擎上搜索一下,可以查阅到更详尽的答案。

1. ES 规范中的私有成员定义

1.1. 正确示例

先来看一个示例:

class Test {
    static #greeting = "Hello";
    #name = "James";

    test() {
        console.log(`${Test.#greeting} ${this.#name}`);
    }
}

// 用一个 IIFE 来代替定义并执行 main()
(() => {
    const t = new Test();
    t.test();               // OUTPUT: Hello James
})();

这个示例在 Chrome 74<sup>+</sup> 和最新版的 Edge 等浏览览器的开发者工具控制台中运行都没有问题。

相关推荐