“super”可以调用基类方法和属性

时间:2016-11-14 05:13:55

标签: 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(){
    console.log(super.initF()); // 2
  }
}

new B().ff();
很明显,我们只能调用基类(A)方法,我们无法调用原型。为什么不能通过“超级”访问基类原型?

2 个答案:

答案 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();