JavaScript类私有属性唯一原生方式是#前缀语法(ES13标准),仅类内可访问,支持字段、方法、getter/setter,必须顶层声明;下划线约定和WeakMap均非真正私有。

JavaScript 的 Class 私有属性目前只能通过 # 前缀语法定义,这是 ECMAScript 2022(ES13)正式标准化的方案,也是唯一原生、真正私有的方式。
用 # 号声明私有字段(推荐)
在类内部用 # 开头的标识符定义私有属性或方法,它们仅在类的自身作用域内可访问,外部和子类都无法直接读写。
- 必须在类体顶层声明(不能在方法里动态创建)
- 支持私有字段(
#name)、私有方法(#getName())、私有 getter/setter(get #value()) - 命名需符合标识符规则,
#_name和#name是不同的私有名
class Counter {
#count = 0; // 私有字段
#step = 1; // 私有字段
<p>increment() {
this.#count += this.#step; // ✅ 允许内部访问
}</p><p>getCount() {
return this.#count; // ✅ 可通过公有方法暴露
}</p><h1>log() { // 私有方法</h1><pre class="brush:php;toolbar:false;">console.log('current:', this.#count);} }
const c = new Counter(); c.increment(); console.log(c.getCount()); // 1 console.log(c.#count); // ❌ SyntaxError:无法访问私有字段
不要用下划线 _ 模拟私有(不安全)
_name 或 _privateProp 只是社区约定,本质仍是公有属性,任何代码都能读写,无法阻止误用或意外修改。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 没有语言级保护,TypeScript 的
private也只在编译期检查,运行时无效 - 调试时会暴露在
console.log(instance)中,可能泄露敏感数据 - 子类可以自由覆盖或访问
this._name,违背封装意图
WeakMap 方案(兼容旧环境,但较重)
在不支持 # 的环境中(如 IE 或部分 Node.js 旧版本),可用 WeakMap 手动模拟私有状态:
- 把实例作为 key,私有数据存进 WeakMap,避免内存泄漏
- 需要额外维护映射表,代码更冗长,且无法实现私有方法
- 适合需要兼容性但又强依赖私有性的场景
const privateData = new WeakMap();
<p>class Person {
constructor(name) {
privateData.set(this, { name }); // 存私有字段
}</p><p>getName() {
return privateData.get(this).name;
}
}
</p>
注意继承中的私有字段限制
子类无法访问父类的私有字段,哪怕名字相同 —— #id 在父类和子类中是两个完全独立的私有名。
- 子类中写
this.#id访问的是子类自己声明的#id,不是父类的 - 无法通过
super.#id访问父类私有成员(语法报错) - 如需共享状态,应通过受控的公有方法或 protected-like 模式间接实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










