在创建类的对象时,会抛出错误

时间:2016-07-05 09:28:08

标签: javascript

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)

1 个答案:

答案 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