JavaScript 中的私有类字段

Car*_* Li 5 javascript static private class class-fields

class A {
  #a = 1;
  static #a = 2;
}
Run Code Online (Sandbox Code Playgroud)

结果是

  • Uncaught SyntaxError: redeclaration of private name #a在火狐浏览器中
  • Uncaught SyntaxError: Identifier '#a' has already been declared在 Chrome 中

尽管

class A {
  a = 1;
  static a = 2;
}
Run Code Online (Sandbox Code Playgroud)

在 Firefox 和 Chrome 中均有效

AFAIK 实例字段将安装在类实例上,而静态字段将安装在类对象本身上。他们并不冲突。为什么之前的代码无效?

Ber*_*rgi 3

实例字段将安装在类实例上,而静态字段将安装在类对象本身上。他们并不冲突。

它们是,因为在表达式中x.#a引擎不知道x是类对象还是类实例。令牌的含义#a应该是静态的,不依赖于对象,它需要引用一个或另一个,但不能同时引用两者。

与由标识符的字符串值标识的普通字符串键控属性(.a.a上下文无关)不同,私有字段具有使用其声明创建的标识(与符号不同)。每个定义#a只能存在一个class,并且在不同的类中,相同的#a语法将引用不同的字段。