ES6 Class 私有属性实现方案与演进

作者:闭包旅人

时间:2026-10-23

浏览:155

本文总结了 JavaScript ES6 Class 中实现私有属性的多种方案,包括命名约定、闭包、Symbol 及 WeakMap 等技巧,并介绍了 ES2015 标准中 # 符号的私有字段提案。文章对比了各方案的优缺点,指出目前实际开发中推荐直接使用 TypeScript 的 private 关键字,并提供了相关技术参考资料。

文章目录

私有属性的定义与特征

私有属性

在面向对象编程(OOP)体系中,私有属性是一项基础且常见的特性,其核心特征通常包含以下几点:

  • 该类内部的其他方法可以访问此属性,但类外部的代码无法直接访问;
  • 子类的实例无法继承父类定义的私有属性。

ES6 Class 的演进与私有字段提案

备胎Class

回顾四年前,即2015年6月,ES6标准正式发布,因纪念这一里程碑,该版本也被称为ES2015。至此,JavaScript中的class关键字从长期“雪藏”状态转为正式标准。在此之前,class虽作为JS保留字存在,却未实际启用。Class被视为JS的一种语法糖,旨在赋予JavaScript用面向对象思想描述实体的能力。然而,其初始功能似乎并未完全满足开发者的期望。为此,TC39委员会致力于完善语言特性,并提出了新的私有属性提案:


class Foo {
 #a; // 私有属性
 constructor(a, b) {
 this.#a = a;
 this.b = b
 }
}

上述私有属性的声明语法,需经过Babel等编译器编译处理后才能在当前环境中正常运行。

该提案目前已推进至Stage 3阶段,未来应用前景广阔。

然而,众多JavaScript开发者已不愿等待标准落地……

JavaScript 实现私有属性的常见方案

JSer的挣扎

通过对数据进行特定封装,JavaScript开发者们探索出了曲线实现“私有属性”的路径。

1. 约定俗成

JS社区形成了一种不成文的规范:在变量名前添加下划线“_”前缀,以此约定该变量为私有属性。但实际上,它依然是一个披着“皇帝新衣”外衣的公共属性,外部仍可访问。

私有属性的定义与特征

2. 闭包

在constructor作用域内定义局部变量,并通过内部闭包机制对外暴露该变量。

这种方式虽实现了外部不可访问,但在类内部,该属性无法在不同方法间共享,因此并非严格意义上的“私有属性”。

私有属性的定义与特征

3. Symbols & Getters

利用Symbol变量可作为对象key的特性,我们可以模拟实现更接近真实的私有属性。

私有属性的定义与特征

然而,该方法并非毫无破绽:

私有属性的定义与特征

借助getOwnPropertySymbols方法可以提取对象的Symbol键值,从而绕过限制。

4. WeakMap & Getters

WeakMap的实现逻辑与Symbol方案类似。

私有属性的定义与特征

巨人的肩膀

以上是目前JavaScript中实现属性私有较为可行的方案。尽管实际项目中较少直接应用,但若在面试中遇到此类问题,这些方案可作为参考。

综上所述,在所有方案中,建议优先选用TypeScript的private关键字。

最后,关于JavaScript中实现私有属性的其他思路,欢迎读者在评论区交流看法。

参照:

ECMAScript Classes - Keeping Things Private

原文:Github

总结

以上就是本文的全部内容,希望这些内容对大家的学习或工作具有参考价值,感谢支持。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章