javascript私有成员使用#前缀是es13正式语法,属语言级强制约束:必须在class内声明、标识符命名、同类实例间可访问、不可与公有同名共存,实现静态可检的真正封装。

JavaScript 中私有方法(和私有字段)使用 # 前缀是 ECMAScript 2022(ES13)正式引入的语法,它不是命名约定,而是强制性的语言级约束。# 开头的成员在类内部可见、外部不可访问,且必须严格遵守若干语法规则。
必须在类定义中声明
# 成员只能出现在 class 声明或表达式内部,不能动态添加,也不能在类外通过任何方式创建或赋值。
- ✅ 正确:在 class body 中直接写
#method() {}或#field = value - ❌ 错误:尝试在实例上赋值
obj.#x = 1(语法错误) - ❌ 错误:在 class 外声明
const #foo = () => {}(语法错误)
名称必须是合法标识符(不能是计算属性)
# 后必须紧跟一个有效的 JavaScript 标识符(字母、$、_ 开头,后续可含数字),不支持方括号计算属性语法。
- ✅ 正确:
#isValid、#_cache、#$handler - ❌ 错误:
#[symbol]、#'name'、#123abc(以数字开头) - ❌ 错误:
#[key](私有字段不支持计算名)
访问仅限于同一类的词法作用域内
私有成员的可见性由「类定义」而非「实例」决定。同一个类的不同实例可以互相访问彼此的私有成员;但子类、父类、同名不同类均不可访问。
- ✅ 允许:
this.#privateMethod.call(otherInstance)(只要 otherInstance 是同一 class 的实例) - ❌ 不允许:子类中写
this.#parentPrivate(报错:私有字段未在子类中声明) - ❌ 不允许:用
Reflect.has(obj, '#x')或obj['#x']访问(语法/运行时错误)
不能与公有同名成员共存
同一个类中,不能同时存在公有和私有版本的同名属性或方法(即使一个是字段、一个是方法也不行)。
- ❌ 错误:
class C { #x = 1; x() {} }(SyntaxError:私有字段和公有属性冲突) - ✅ 正确:改名,如
#x和getX(),或统一用私有#x()和#x
这套语法的核心目标是提供真正的封装能力,而不是靠下划线约定“暗示”私有。所有约束都是静态可检查的,引擎会在解析阶段报错,不依赖运行时行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











