为 Javascript class 创建静态或 Class 变量的现代方法

Modern way to create static or Class variable for Javascript class

我一直在寻找一个明确的答案,大多数弹出的内容仍然与旧的(或者我应该说 "traditional")定义 classes 的方式有关function.

根据,

Class properties are not supported in ES2015.

据我所知,将静态变量添加到 class 的唯一方法是:

https://jsfiddle.net/abalter/fknwx3n4/

class C {

  constructor(x) {
    console.log("in constructor " + x);
    this.x = x;
    this.add(this.x);
  }

  add(x) {
    console.log("in add " + x);
    C.alist.push(x);
  }

  show() {
    console.log("in show");
    console.log(C.alist);
  }
}

// MUST be done outside of actual class definition.
C.alist = [];

c1 = new C(5);
c1.show();
c2 = new C(10);
c1.show();
c2.show();

故事就这样结束了吗?无法在 class 定义中执行此操作似乎很奇怪。

您可以在定义 class 后立即调用初始化所有静态成员的静态函数,然后可选择删除该函数。 (可能重置静态变量是一项功能?)

这将允许您将所有静态变量保留在 class 声明中。

class C {
  static init() {
    C.alist = [];
  }

  constructor(x) {…}
  add(x) {…}
  show() {…}
}
C.init();
delete C.init;

另一种选择是在构造函数中初始化静态变量,但这需要在使用静态变量之前至少实例化一个对象。

class C {
  constructor(x) {
    C.alist = C.alist || [];
    …
  }
  add(x) {…}
  show() {…}
}

如果您只关心 class 及其静态属性在一个结构中的风格封装,您应该考虑使用模块模式(就像 封装构造函数和原型).

在 ES6 中,还有 Object.assign 可以用于此目的:

const C = Object.assign(class {
    constructor() {
        …
    }
    methods() { … }
    …
}, {
    of(x) { … },
    static_methods() {…},
    …
    static_property: …
});