ES6 Class 私有属性实现方案与演进
本文总结了 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
总结
以上就是本文的全部内容,希望这些内容对大家的学习或工作具有参考价值,感谢支持。
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
