重学es6

class讲解之10 super

2020-08-11  本文已影响0人  zhang463291046

以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途

super必须显式指定是作为函数、还是作为对象使用,否则会报错

class A {
  x =1
}

class B extends A {
  constructor() {
    super();
    console.log(super.x) //  1
    console.log(super); // 报错
  }
}

在子类实例方法中通过super调用父类的实例方法时,这时super将指父类的原型对象,父类方法内部的this此时指向当前的子类实例

class A {
  x = 1
  static x = 2
  print() {
    console.log(this.x);  //  this指向b
  }
  static print() {
    console.log(this.x);
  }
}

class B extends A {
  static x = 3
  constructor() {
    super();
    this.x = 4;
  }
  m() {
    super.print();   //  super指向A.prototype
  }
  static m() {
    super.print(); 
  }
}

let b = new B();
b.m() // 4

// 没有实例化,此时父类实例方法this指向B.prototype
B.prototype.m() //  undefined

在子类静态方法中通过super调用静态父类的方法时,这时super将指向父类,而不是父类的原型对象,父类方法内部的this指向当前的子类,而不是子类的实例

class A {
  x = 1
  static x = 2
  print() {
    console.log(this.x);
  }
  static print() {
    console.log(this.x);//  this指向B
  }
}

class B extends A {
  static x = 3
  constructor() {
    super();
    this.x = 4;
  }
  m() {
    super.print();
  }
  static m() {
    super.print();    //  super指向A
  }
}
B.m() // 3

小结:父类中的this其实就是子类中的this

上一篇下一篇

猜你喜欢

热点阅读