javascript 中的私有字段(#)只能在 class 声明内部定义,对象字面量中使用会报 syntaxerror;合法位置仅限 class 类体顶层,非法位置包括对象字面量、解构、json 等非 class 上下文。

JavaScript 中的私有字段(#)不能在对象字面量中使用。
这是语法层面的硬性限制:# 私有字段和私有方法只被允许在 class 声明内部定义,对象字面量(如 { #x: 1 })不支持该语法,直接写会报 SyntaxError。
- ✅ 合法位置:
class的类体顶层(如#value = 0;或#method() {}) - ❌ 非法位置:对象字面量、函数表达式、
Object.assign()、解构、JSON、Object.create()等任何非 class 类体的上下文
例如这些写法都会出错:
-
const obj = { #id: 123 };→ SyntaxError -
const obj = { ["#" + "name"]: "Alice" };→ 创建的是普通字符串键"#name",不是私有字段 -
const { #id } = instance;→ 解构私有字段是语法错误 -
JSON.stringify(obj)不会包含私有字段 —— 它根本不存在于属性枚举中
如果你需要类似“私有数据”的对象结构,可考虑以下替代方式:
- 用 class 封装:把逻辑和私有状态放进 class,对外只暴露公有接口
- 用 WeakMap 关联外部数据(适合已有普通对象需附加私有状态)
- 用 Symbol 作键(虽非真正私有,但避免命名冲突,且不被常规遍历捕获)
总之,`#` 是专属于 class 的封装机制,不是通用对象属性修饰符。想用私有字段,就得用 class。











