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()关键字.我相信这是为了继承?我让谷歌找到了一些东西,但这似乎是最简单的例子,但很少有人参考.
我无法使用此代码.
什么是构造函数和super()关键字.我相信这是为了继承?
那就对了.上面设置了类B,然后有类A子类.这constructor是在创建类的新实例时调用的函数,如let c = new A("Testing", "37");代码中的行.与其他一些语言不同,在JavaScript中只能有一个类的构造函数.
super在子类中用于引用超类.在构造函数中,您调用 super它就像是一个函数,并调用超类的构造函数,使其有机会对由其创建的新对象进行初始化new.因此,例如,在A的constructor,super()来电B的constructor.
您还可以使用super属性访问器表达式的源来访问超类上的属性(包括方法).这就是正在发生的事情A的printName方法,它使用super.printName()调用B的printName方法.(哪个会失败,因为B没有printName方法; B调用方法printn.)
如果我没有指出,虽然这看起来很像基于类的OOP,比如Java或C#,但事实并非如此.它是使用构造函数设置JavaScript的正常原型继承的语法糖(良好的糖).它极大地简化了使用构造函数设置原型继承层次结构的过程.如果我没有指出使用构造函数来进行原型继承是没有必要的话,我也会失职,你可以在不使用构造函数的情况下进行原型继承Object.create.
还有很多值得探索的地方.MDN可能是一个很好的起点.
我无法使用此代码.
将C在Console.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)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |