扩展定义的类。如何调用超类的构造函数?

时间:2017-04-11 16:12:34

标签: javascript class reflection extends es6-class

鉴于2个已定义的类MN,我想M扩展N

为此,我想使用this answer (2nd solution)中描述的setPrototypeOf()

Reflect.setPrototypeOf( M.prototype, N.prototype ) 

此外,我希望该课程M constructor()拨打课程N constructor()

为实现这一目标,我使用以下电话:

Reflect.construct( Reflect.getPrototypeOf( M.prototype ).constructor, args, M )

注意:我不在N中使用construct()因为我希望它能够工作,即使这个类没有被扩展(或者扩展到另一个类)。

它适用于我的测试,但我不确定这是最好的方法。

class N {
  constructor() {
    console.log('N created')
  }
  get N() {
    return 'N-prop'
  }
}

class M {
  constructor(...args) {
    console.log('M created')
    return Reflect.construct(Reflect.getPrototypeOf(M.prototype).constructor, args, M)
  }
  get M() {
    return 'M-prop'
  }
}

Reflect.setPrototypeOf(M.prototype, N.prototype)

var m = new M
console.log(m.M, m.N)

有没有更好,更合适的方法呢?

1 个答案:

答案 0 :(得分:0)

M延长N,请先使用extends关键字。然后,要从子类调用父类,请在子组件的构造函数中使用关键字super

class N {
  constructor() {
    console.log('N created');
  }
  get N() {
    return 'N-prop';
  }
}

class M extends N {
  constructor(...args) {
    console.log('M created');
    super();
  }
  get M() {
    return 'M-prop';
  }
}

const m = new M(); // -> M created
                   // -> N created

您提到即使N未从M继承,您也希望能够致电N的构造函数 - 如果是这种情况,您可能想要考虑重构代码。你想要调用另一个不相关的类的构造函数似乎很不寻常。