为 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: …
});
我一直在寻找一个明确的答案,大多数弹出的内容仍然与旧的(或者我应该说 "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: …
});