我正在尝试使用es6类语法编写一个子类。子类在调用超类构造函数之前需要执行一些复杂的逻辑,因此我尝试将其分解为一个函数。但是,这似乎是不可能的,因为在调用this
之后才定义super()
。
我尝试过两次简单地调用super()
,一次是在构造函数的开始,一次是在构造函数的末尾,但是这感觉不对,并且浪费了超类构造函数第一次执行的工作。
class Parent {
constructor(x) {
console.log('some expensive thing with ' + x);
}
}
class Child extends Parent {
constructor() {
let x = this.f();
super(x);
}
f() {
// complicated logic
return 3;
}
}
let c = new Child();
在ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor at new Child
中以书面形式运行代码。删除this
并尝试调用f()
会导致ReferenceError: f is not defined at new Child
。
即使没有绑定this
,也可以在其他地方分解子类构造函数的逻辑吗?
答案 0 :(得分:1)
使用静态方法可能是解决方案。
class Parent {
constructor(x) {
console.log('some expensive thing with ' + x);
}
}
class Child extends Parent {
constructor() {
let x = Child.f();
super(x);
}
static f() {
// complicated logic
return 3;
}
}
let c = new Child();
答案 1 :(得分:1)
我将使用与构造函数分开的初始化函数,因为它可以让您更好地控制何时/是否发生父初始化。
class Parent {
constructor(x) {
this.init(x);
console.log("parent constructor does other stuff");
}
init(x) {
console.log("parent init runs")
}
}
class Child extends Parent {
constructor(x) {
super(x);
}
init(x) {
console.log("child init runs");
super.init(x); // This call is optional if you don't want to run the parent's init code
}
}
let c = new Child();