You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:10:11