2016-11-14 60 views
1

在ES6,“超级”可以调用基类,如:“超级”可以调用基类的方法和属性

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)的方法,我们不能称之为原型。为什么不能通过“超级”访问基类的原型?

+1

派生类得到的所有财产从基类。所以你可以使用'this'来访问我所有的属性基类。 console.log(this.p); –

+0

_“为什么不能通过”super“访问基类原型”_ _其实,这就是你在你的例子中所做的。 – zeroflagL

回答

1

其实你可以。

要回答你的问题:JavaScript不会把继承的属性放在原型链上。如果你想,你需要自己设置:A.prototype.p = 5

如果你从另一个类继承,你的方法将被放在原型上,所以它们将被跨类共享,并且你可以覆盖基类中的方法。那很好。

现在,如果你继承,你需要调用​​ 那么基类的构造函数将被调用,您可以访问属性: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

超级关键字用来调用对象的父功能。

super.prop和super [expr]表达式在任何方法 在类和对象文字中都有效。

您可以通过使用this但只在基类constructor

调用super()对于后访问父属性更多阅读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();