ES2022正式引入井号(#)语法支持类中真正的私有字段和私有方法,只能在类内部访问;私有字段需在类体顶层声明并以#开头,不可外部访问、枚举或代理拦截;私有方法同样以#开头,不可继承或外部调用;私有成员属于类结构而非运行时属性,不参与属性查找且无法通过Reflect.ownKeys等获取。

ES6 并不支持私有属性,井号(#)语法是 ES2022(ECMAScript 13)正式引入的特性,不是 ES6 的内容。它用于在 class 中声明真正的私有字段和私有方法,且只能在类内部访问。
私有字段:用 # 声明并初始化
在 class 内部,用 # 开头定义字段,它会成为该实例独有的私有成员,外部不可访问、不可枚举、不可代理拦截。
- 必须在类体顶层声明(不能在方法里动态加),可带初始值
- 访问时也必须加
#,否则报错(语法强制) - 不同实例的私有字段互不影响
示例:
class Counter {
#count = 0; // 私有字段,自动初始化为 0
<p>increment() {
this.#count++; // ✅ 正确:类内访问
}</p><p>getCount() {
return this.#count; // ✅ 可通过公有方法暴露
}
}</p><p>const c = new Counter();
c.increment();
console.log(c.getCount()); // 1
// console.log(c.#count); // ❌ 语法错误:无法在类外读取
私有方法:同样用 # 前缀
私有方法也以 # 开头,只能被同一个 class 内的其他方法调用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 支持普通方法、getter/setter、异步方法、生成器等
- 不能被继承、不能被重写、不能被外部调用
示例:
class BankAccount {
#balance = 0;
#validateAmount(amount) { // 私有方法
return typeof amount === 'number' && amount >= 0;
}
<p>deposit(amount) {
if (this.#validateAmount(amount)) {
this.#balance += amount;
}
}
}
注意:# 字段不是“变量”,而是类的一部分
私有字段属于类的结构定义,不是运行时动态添加的属性:
- 不能用
Object.keys(this)、for...in或JSON.stringify获取 - 不存在于
this的原型链上,也不参与属性查找 - 浏览器开发者工具中通常显示为
<private>或隐藏(取决于实现)
兼容性与使用前提
需确保运行环境支持 ES2022 私有字段(现代 Chrome/Firefox/Safari 和 Node.js ≥ 14.6 默认启用):
- Babel 转译需启用
@babel/preset-env并设置目标环境 - TypeScript 支持良好(v4.3+),但类型检查时需显式声明(如
private #foo: number) - 不支持通过
Reflect.ownKeys或Object.getOwnPropertyNames列出

















