实例化子类而无需构造

时间:2019-08-17 10:12:35

标签: javascript ecmascript-6

我正在尝试使用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,也可以在其他地方分解子类构造函数的逻辑吗?

2 个答案:

答案 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();