JavaScript中的继承和超级

IGD*_*Dev 0 javascript inheritance class super ecmascript-6

我在学习JavaScript的第3天.我遇到了这段代码:

class B {
    constructor(name) {
        this.name = name;
    }

    printn() {
        return this.name;
    }
}

class A extends B {
    constructor(name, age) {
        super(name);
        this._age = age;
    }

    get age() {
        return this._age;
    }

    printName(){
        return super.printn();
    }
}

let c = new A("Testing", "37");
Console.log(c.printn());
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这段代码的作用.什么是构造函数和super()关键字.我相信这是为了继承?我让谷歌找到了一些东西,但这似乎是最简单的例子,但很少有人参考.

我无法使用此代码.

T.J*_*der 7

什么是构造函数和super()关键字.我相信这是为了继承?

那就对了.上面设置了类B,然后有类A子类.这constructor是在创建类的新实例时调用的函数,如let c = new A("Testing", "37");代码中的行.与其他一些语言不同,在JavaScript中只能有一个类的构造函数.

super在子类中用于引用超类.在构造函数中,您调用 super它就像是一个函数,并调用超类的构造函数,使其有机会对由其创建的新对象进行初始化new.因此,例如,在Aconstructor,super()来电Bconstructor.

您还可以使用super属性访问器表达式的源来访问超类上的属性(包括方法).这就是正在发生的事情AprintName方法,它使用super.printName()调用BprintName方法.(哪个会失败,因为B没有printName方法; B调用方法printn.)

如果我没有指出,虽然这看起来很像基于类的OOP,比如Java或C#,但事实并非如此.它是使用构造函数设置JavaScript的正常原型继承的语法糖(良好的糖).它极大地简化了使用构造函数设置原型继承层次结构的过程.如果我没有指出使用构造函数来进行原型继承是没有必要的话,我也会失职,你可以在不使用构造函数的情况下进行原型继承Object.create.

还有很多值得探索的地方.MDN可能是一个很好的起点.

我无法使用此代码.

CConsole.log不应该大写,所以变化

Console.log(c.printn());
Run Code Online (Sandbox Code Playgroud)

console.log(c.printn());
Run Code Online (Sandbox Code Playgroud)

除此之外,如果您正在使用支持的JavaScript引擎class(例如Google Chrome或Mozilla Firefox中的那个),那么该代码工作正常,但再次注意A看起来似乎B有一个printName方法,但它没有,并且最后的代码是调用printn只有B(这很好,它只是意味着A代码并没有真正涉及).

class B {
    constructor(name) {
        this.name = name;
    }

    printn() {
        return this.name;
    }
}

class A extends B {
    constructor(name, age) {
        super(name);
        this._age = age;
    }

    get age() {
        return this._age;
    }

    printName(){
        return super.printName();
    }
}

let c = new A("Testing", "37");
console.log(c.printn());
Run Code Online (Sandbox Code Playgroud)