JavaScript中私有存取器必须配合同名私有字段(#前缀)使用,语法为get #name()和set #name(v),字段需在类体顶层显式声明,仅限类内部访问,外部调用报错。

JavaScript 中 class 语法里,私有属性的存取器(即私有 getter/setter)需配合私有字段(# 前缀)使用,不能直接在 public 属性上定义私有访问器,也不能用 get #name() 这类语法(语法错误)。
私有字段必须先声明,再定义对应的 getter/setter
私有存取器操作的是同一个私有字段,该字段需在类体顶层用 # 显式声明(ES2022 起支持在字段声明中初始化):
- 私有字段名以
#开头,例如#value - getter 和 setter 名也必须带
#,且名称与字段一致,如get #value()、set #value(v) - 二者必须成对出现在 class 内部,且只能访问同名私有字段
✅ 正确写法示例:
class Counter {
#count = 0; // 私有字段,可选初始化
get #count() { // 私有 getter
return this.#count;
}
set #count(value) { // 私有 setter
if (Number.isInteger(value) && value >= 0) {
this.#count = value;
}
}
increment() {
this.#count++; // 内部可正常读写
}
// 注意:无法从外部调用 this.#count 或 this.#count = 5
}
私有存取器只能在类内部调用
即使定义了私有 getter/setter,外部代码仍无法访问它们:
立即学习“Java免费学习笔记(深入)”;
-
obj.#count—— 报错:SyntaxError(非法标识符)或TypeError(无法读取私有成员) -
obj['#count']、Reflect.get(obj, '#count')等反射方式也无效 - 仅限类自身方法(包括原型方法、实例方法、构造函数内)中通过
this.#count访问
不能混用公有与私有同名访问器
以下写法是**禁止的**,会触发语法错误:
-
get count() { return this.#count; }是合法的(公有 getter 返回私有值),但不是“私有存取器” -
get #count() { ... }和get count() { ... }同时存在 —— ✅ 允许(一个私有、一个公有,互不冲突) -
get #count() { ... }却没有对应#count私有字段声明 —— ❌ 报错:私有字段未定义
兼容性与构建注意事项
私有字段及私有存取器是 ECMAScript 标准(Stage 4),现代浏览器和 Node.js(v14.6+)原生支持:
- Babel 需启用
@babel/plugin-proposal-private-methods和@babel/plugin-proposal-class-properties - TypeScript 支持良好(
target: es2022或更高),但类型检查中#field不参与类型推导,建议搭配private field: type注释辅助 - 注意:私有字段不可枚举、不可遍历、不可被
in检测,也不出现在Object.keys()或JSON.stringify()中


















