如何用Symbol结合#语法声明ES6+类的真正私有字段?
问题解答
首先,你遇到的语法错误是因为ECMAScript规范明确限制:类的私有字段(#开头的字段)的名称必须是静态标识符,不能是动态计算的表达式(比如Symbol.for('xxx')这种返回Symbol的表达式),所以#[Symbol.for('...')]这种写法本身就不符合语法规则。
如果你的需求是创建一个私有且值为Symbol的字段,仅用#语法就能实现,不需要WeakMap或闭包:
class MyClass { // 私有字段,值为Symbol,外部无法直接访问 #privateSymbol = Symbol.for('my-symbol-prop1'); // 可选:提供方法间接访问(按需) getPrivateSymbol() { return this.#privateSymbol; } } const instance = new MyClass(); console.log(instance.getPrivateSymbol()); // 输出对应的Symbol console.log(instance.#privateSymbol); // 报错:私有字段不可在类外部访问
如果你的需求是创建键为Symbol的私有属性,那目前ECMAScript规范不支持直接用#[Symbol(...)]的语法实现,因为私有字段的名称必须是静态标识符,不能是动态表达式。这种情况下,用上述“私有字段存储Symbol”的方案已经能满足私有性需求——毕竟私有字段本身就具备严格的访问限制,不需要依赖Symbol来实现私有性。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

