super是es6新出的关键字,可以当作函数使用,也可以当作对象使用

一、super当做函数使用

super当做函数使用时,super代表其父类的构造函数constructor,super()相当于Father.prototype.constructor.call(this)

  1. class Father{
  2. constructor(){
  3. this.a = 1;
  4. }
  5. }
  6. class Son extends Father{
  7. constructor(){
  8. super();
  9. }
  10. }

二、super用作对象使用

2-1 普通方法中使用

super在普通方法中指向父类的原型对象

  1. //super作为对象在普通方法中使用
  2. class Father {
  3. constructor() {
  4. this.a = 1;
  5. }
  6. //p函数是挂载到Father原型上的
  7. p() {
  8. console.log(thia.a);
  9. console.log('hello');
  10. }
  11. }
  12. class Son extends Father {
  13. constructor() {
  14. super();     
  15. this.a = 2;
  16. super.p(); //'2 hello' Father.prototype.p()方法内部的this指向的是子类实例
  17. super.a; //undefined super无法访问Father的实例属性a,只可以访问其原型对象上的p
  18. }
  19. }

2-2 静态方法中使用

super在静态方法中指向父类

  1. //super作为对象在静态方法中使用
  2. class Parent {
  3. static myMethod(msg) {
  4. console.log('static', msg);
  5. }
  6. myMethod(msg) {
  7. console.log('instance', msg);
  8. }
  9. }
  10. class Child extends Parent {
  11. static myMethod(msg) {
  12. super.myMethod(msg);
  13. //super指向父类因此访问的是static myMethod
  14. }
  15. myMethod(msg) {
  16. super.myMethod(msg);
  17. //super指向的是父类的原型,访问的是Parent.prototype.myMethod
  18. }
  19. }
  20. Child.myMethod(222);//static 222
  21. let child = new Child;
  22. child.myMethod(111);//instance 111