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)方法,我们无法调用原型。为什么不能通过“超级”访问基类原型?
答案 0 :(得分:1)
其实你可以。
回答你的问题:JavaScript没有将属性继承在原型链上。如果您愿意,您需要自己设置:A.prototype.p = 5
如果从其他类继承,您的方法将被放在原型上,因此它们将在各个类之间共享,您可以从基类覆盖该方法。这很好。
现在,如果你继承,你需要致电super();
然后将调用基类的构造函数,您可以使用:this.p
而不是super.p
来访问该属性。因为那样,你将改变所有(下一个)继承类的属性(在原型中) - 但这不是我们想要的。我们希望每个类继承自己的属性。
也许你看看TypeScript
。你可以用更多的语法糖来减少写作。
class A {
constructor(){
this.p = 2;
}
initF(){
return this.p
}
}
class B extends A {
constructor(){
super();
console.log("super.constructor.prototype: ", super.constructor.prototype);
console.log("super.constructor.prototype.p: ", super.constructor.prototype.p);
console.log('A.prototype.p', A.prototype.p);
console.log('this.__proto__.', this.__proto__.p);
console.log('super.p', super.p);
console.log(super.initF());
}
ff(){
console.log(super.initF());
}
}
class C extends B {
constructor() {
super();
}
}
new B().ff();
A.prototype.p = 10;
new C().ff();

答案 1 :(得分:1)
super关键字用于调用对象父级的函数。
super.prop和super [expr]表达式在任何方法中都有效 类和对象文字中的定义。
您可以使用this
访问父级属性,但只能在基类super()
中调用constructor
之后
更多阅读here
class A{
constructor(){
this.p = 2;
}
initF(){
return this.p
}
}
class B extends A{
constructor(){
super();
console.log(super.p); // invalid = undefined
console.log(super().p); // valid = 2
console.log(super.initF()); // 2
}
ff(){
console.log(super.initF()); // 2
}
}
new B().ff();