引题
我们在定义javascript类时,有时候会定义一些静态方法,并在一些实例方法中引用这些静态方法。
例子:
class C {
static getData() {
console.log('this is static method');
}
f() {
C.getData();
}
}
C.getData(); 这种写法确实可以达到实例方法中调用静态方法的目的,但是需要将类名写死,类中的代码需要多处维护该类名,着实不是什么好的使用方式。答案
我们可以这样修改,来达到不写死类名的目的:
C.getData() => this.constructor.getData()
class C {
static getData() {
console.log('this is static method');
}
f() {
this.constructor.getData();
}
}要注意的坑
我们在实例方法中可以这样调用:this.constructor.getData();
但是在静态方法中却不可以这样。静态方法中的执行上文是当前类,而不是当前实例,因此this指向的是当前类。而ES6的类实际上是function的语法糖,因此当前类的constructor属性实际上是Function,这一点一定要切记。因此在静态方法中要引用另一个静态方法,直接这样既可:this.getData(); 因为this即是constructor本身。
class C {
static getData() {
console.log('this is static method');
}
static getStatus() {
console.log('this is getStatus');
// 该this是类本身
this.getData();
}
f() {
this.constructor.getData();
}
}总结
因此大家还是要根据实际的情况来决定是否要写死类名。一切以好维护为目标。