Javascript “;超级”;可以调用基类方法和属性
在es6中,“super”可以调用基类,如:Javascript “;超级”;可以调用基类方法和属性,javascript,ecmascript-6,Javascript,Ecmascript 6,在es6中,“super”可以调用基类,如: class A{ constructor(){ this.p = 2; } initF(){ return this.p } } class B extends A{ constructor(){ super(); console.log(super.p); // undefined console.log(super.initF()); // 2 } ff(){ cons
class A{
constructor(){
this.p = 2;
}
initF(){
return this.p
}
}
class B extends A{
constructor(){
super();
console.log(super.p); // undefined
console.log(super.initF()); // 2
}
ff(){
console.log(super.initF()); // 2
}
}
new B().ff();
很明显,我们只能调用基类(A)方法,而不能调用原型。为什么不能通过“super”访问基类原型?实际上可以
回答您的问题:JavaScript不会将继承的属性放在原型链上。如果需要,您需要自己设置:A.prototype.p=5
如果您从另一个类继承,那么您的方法将放在原型上,因此它们将在类之间共享,并且您可以从基类覆盖该方法。那很好
现在,如果继承,则需要调用super()代码>
然后将调用基类的构造函数,您可以使用:this.p
而不是super.p
访问属性。因为这样,您将更改所有(下一个)继承类的属性(在原型中)——但这不是我们想要的。我们希望每个类都继承一个自己的属性
也许你可以看看TypeScript
。你可以用更多的语法糖写更少的东西
A类{
构造函数(){
这个p=2;
}
initF(){
把这个还给我
}
}
B类扩展了A类{
构造函数(){
超级();
log(“super.constructor.prototype:”,super.constructor.prototype);
log(“super.constructor.prototype.p:”,super.constructor.prototype.p);
log('A.prototype.p',A.prototype.p');
log('this.\uuuuu proto\uuuuuu.',this.\uuuuu proto\uuuuuu.p);
console.log('super.p',super.p');
log(super.initF());
}
ff(){
log(super.initF());
}
}
C类扩展到B类{
构造函数(){
超级();
}
}
新的B().ff();
A.p=10;
新的C().ff()代码>
super关键字用于调用对象父对象上的函数
super.prop和super[expr]表达式在任何方法中都有效
类和对象文本中的定义
您可以使用this
访问父属性,但只能在基类构造函数中调用super()
后访问
更多阅读
A类{
构造函数(){
这个p=2;
}
initF(){
把这个还给我
}
}
B类扩展了A类{
构造函数(){
超级();
console.log(super.p);//无效=未定义
console.log(super().p);//valid=2
console.log(super.initF());//2
}
ff(){
console.log(super.initF());//2
}
}
新的B().ff()代码>派生类从基类获取所有属性。因此您可以使用“this”访问基类中的所有属性。console.log(this.p);为什么不能通过“super”访问基类原型实际上,这就是您在示例中所做的。