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

aba*_*ter 7 javascript oop class static-members ecmascript-6

我一直在寻找一个明确的答案,弹出的大部分内容仍然与旧的(或者我应该说"传统的")方式相关function.

根据这个SO答案,

ES2015不支持类属性.

据我所知,向类中添加静态变量的唯一方法是:

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();
Run Code Online (Sandbox Code Playgroud)

这是故事的结尾吗?在类定义中无法做到这一点似乎很奇怪.

4ca*_*tle 2

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

\n\n

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

\n\n
class C {\n  static init() {\n    C.alist = [];\n  }\n\n  constructor(x) {\xe2\x80\xa6}\n  add(x) {\xe2\x80\xa6}\n  show() {\xe2\x80\xa6}\n}\nC.init();\ndelete C.init;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
class C {\n  constructor(x) {\n    C.alist = C.alist || [];\n    \xe2\x80\xa6\n  }\n  add(x) {\xe2\x80\xa6}\n  show() {\xe2\x80\xa6}\n}\n
Run Code Online (Sandbox Code Playgroud)\n