class A{
constructor(){
this.name="A";
}
M1(){
return "M1";
}
}
class B extends A{
constructor(){
this.id="B";
}
M2(){
return "M2";
}
}
var b = new B();
输出:
ReferenceError:未定义 在B(复制:4:1) 在repl:1:9 在REPLServer.defaultEval(repl.js:262:27) 在界(domain.js:287:14) 在REPLServer.runBound [as eval](domain.js:300:12) 在REPLServer。 (repl.js:431:12) 在emitOne(events.js:82:20) 在REPLServer.emit(events.js:169:7) 在REPLServer.Interface._onLine(readline.js:211:10) 在REPLServer.Interface._line(readline.js:550:8)
答案 0 :(得分:5)
您必须调用超级构造函数。当您调用基类构造函数时,它会创建this
,然后您可以使用this
。
class A{
constructor(){
this.name="A";
}
M1(){
return "M1";
}
}
class B extends A{
constructor(){
super();
this.id="B";
}
M2(){
return "M2";
}
}
<强>更新:强>
您需要从派生类构造函数调用超构造函数的原因是由于ES6分配实例的位置 - 它们由基类中的/分配(这是必要的,以便构造函数可以被子类化,具有异常实例,例如Array):
// Base class
class A {
// Allocate instance here (done by JS engine)
constructor() {}
}
// Derived class
class B extends A {
constructor() {
// no `this` available, yet
super(); // receive instance from A
// can use `this` now
}
}
// Derived class
class C extends B {
constructor() {
// no `this` available, yet
super(); // receive instance from B
// can use `this` now
}
}
感谢 Axel Rauschmayer 有关详情,请参阅此处https://esdiscuss.org/topic/super-on-class-that-extends