[英]How do I call a super constructor outside a constructor?
现在,JavaScript具有类,我想知道如何在类构造函数之外调用超级构造函数。
我不成功的幼稚尝试(导致SyntaxError):
class A
{
constructor() { this.a = 1; }
}
function initB()
{
super(); // How to invoke new A() on this here?
this.b = 2;
}
class B extends A
{
constructor() { initB.call(this); }
}
我知道在Java之类的其他语言中,只能在派生类的构造函数内部调用超级构造函数,但是ES6类是用于基于原型的继承的语法糖,因此如果使用此方法不可行,我会感到惊讶内置语言功能。 我只是似乎不知道正确的语法。
到目前为止,我所拥有的最好的感觉就像是在作弊:
class A
{
constructor() { this.a = 1; }
}
function initB()
{
let newThis = new A();
newThis.b = 2;
return newThis;
}
class B extends A
{
constructor() { return initB(); }
}
extends
某些内容的类的每个构造函数都必须包含一个直接的super(…)
调用。
直接的super(…)
调用只能放在构造函数中。 真的没有办法解决这个问题。
实际上,您不应将类的初始化逻辑放在其构造函数之外的任何地方。 直接而正确的解决方案是根本不使用initB
:
class A {
constructor() { this.a = 1; }
}
class B extends A {
constructor() {
super();
this.b = 2;
}
}
也就是说,有一种方法可以颠覆“ super()
调用必须在构造函数中”的要求。 将其放入箭头函数也很重要! 所以你可以做
class A {
constructor() { this.a = 1; }
}
function initB(_super) {
var b = _super();
b.b = 2;
}
class B extends A {
constructor() {
initB(() => super());
}
}
请保证我永远不要这样做。
另一种模式是根本不调用super()
,只要您从构造函数中返回一个对象,该方法就起作用。 这样,您可以将对象的实际构造放在其他任何地方:
class A {
constructor() { this.a = 1; }
}
function makeB() {
var b = Reflect.construct(A, [], B); // call the A constructor with B for the prototype
b.b = 2;
return b;
}
class B extends A {
constructor() {
return makeB();
}
}
真的不是更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.