如何理解MDN中「唯一例外是两个声明为getter-setter对」的表述
JavaScript私有类字段命名空间例外规则解析
MDN原文规则引用
存在一些额外的语法限制:
- 类内声明的所有私有标识符必须唯一,静态与实例属性共享命名空间。唯一例外是当两个声明定义一个getter-setter对时。
- 私有标识符不能是
#constructor。
问题代码与报错
我对上述加粗规则理解有误,编写了如下代码:
class MyClass { static #privateProperty = 10; #privateProperty = 20; get #privateProperty() {} set #privateProperty(value) {} }
运行后触发语法错误:
Uncaught SyntaxError: Identifier '#privateProperty' has already been declared
规则本质与代码问题分析
MDN里的例外规则核心意思是:同一个私有标识符,要么用来定义普通的静态/实例私有属性,要么用来定义一组getter-setter对,二者只能选其一;只有getter和setter配对使用时,才允许复用同一个私有标识符。
具体细节:
- 静态私有属性、实例私有属性、私有getter/setter共享同一个命名空间,彼此之间绝对不能重名
- 唯一的例外场景:一个私有标识符可以同时有对应的get和set方法,这两个声明算一组逻辑单元,不会被判定为重复声明
你的代码里,#privateProperty被同时用来定义静态私有属性、实例私有属性,以及getter-setter对,三次声明属于不同类型的私有成员,完全违反了命名空间唯一的规则,因此直接抛出语法错误。
正确用法示例
示例1:仅使用私有getter-setter对
class MyClass { #internalValue = 0; // 仅为该标识符定义getter和setter,无同名属性 get #privateProperty() { return this.#internalValue; } set #privateProperty(value) { this.#internalValue = value > 0 ? value : 0; } constructor(val) { this.#privateProperty = val; console.log(this.#privateProperty); } } new MyClass(10); // 输出10 new MyClass(-5); // 输出0
示例2:仅使用静态/实例私有属性
class MyClass { static #staticPrivate = 10; #instancePrivate = 20; getStaticVal() { return MyClass.#staticPrivate; } getInstanceVal() { return this.#instancePrivate; } } const obj = new MyClass(); console.log(obj.getStaticVal()); // 输出10 console.log(obj.getInstanceVal()); // 输出20
内容的提问来源于stack exchange,提问作者desen zhao
相关产品推荐
相关产品推荐

