JavaScript类中公有字段直接声明(如name = 'default'),可外部读写;私有字段必须以#开头(如#id = 123),仅类内可通过this.#id访问,外部访问报错,且不支持polyfill。

JavaScript 中类字段的私有与公有声明,关键在于语法符号和浏览器/环境支持。公有字段直接写变量名,私有字段必须以 # 开头,且只能在类内部通过 # 访问。
公有字段:不加前缀,可被外部读写
公有字段在类体中直接声明,无需 constructor,会自动添加到每个实例上:
- 写法:
name = 'default';或count = 0; - 外部可自由访问:
obj.name、obj.count = 5; - 注意:它不是原型属性,而是实例自有属性(等价于在 constructor 里写
this.name = ...)
私有字段:必须用 # 前缀,仅限类内使用
私有字段以 # 开头,这是硬性语法规则,不可省略或替换:
- 写法:
#id = 123;、#cache = new Map(); - 只能在类定义内部访问:
this.#id合法,obj.#id会报SyntaxError或TypeError - 私有方法也需用 #:
#validate() { ... },调用时写this.#validate() - 不能在私有字段上使用
delete this.#id,也不支持私有 getter/setter 的简写形式(必须显式写get #value())
常见误区与注意事项
这些点容易出错,需要特别留意:
-
# 不是命名约定,是语法必需:写成
_id或privateId都不算私有,只是习惯写法,无法阻止外部访问 -
私有字段不能在 class 外定义:不能在 constructor 外动态加
this.#x = ...,必须在类体顶层声明 -
暂不支持私有静态字段的初始化表达式(如
static #flag = true;是合法的,但部分旧版 Node.js 或转译器可能不支持,建议检查目标环境) - 若需兼容老环境(如 IE 或早期 Node.js),私有字段无法 polyfill,必须用闭包或 WeakMap 模拟,但会丢失语法简洁性和 instanceof 行为
一个完整示例
结合公有、私有字段和方法的实际写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class Counter {
// 公有字段
label = '计数器';
<p>// 私有字段</p><h1>value = 0;</h1><h1>step = 1;</h1><p>// 公有方法
increment() {
this.#value += this.#step;
return this.#value;
}</p><p>// 私有方法</p><h1>reset() {</h1><pre class="brush:php;toolbar:false;">this.#value = 0;}
// 公有 getter 访问私有值(推荐方式) get value() { return this.#value; }
set value(v) { if (Number.isInteger(v)) this.#value = v; } }
使用:const c = new Counter(); c.increment(); c.value; // ✅,而 c.#value 会立即报错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










