extends 和 super

//子类继承父类  能够继承什么呢?
class Person{
  constructor(name){
    this.name = name;   //实例属性
    this.run = function(){ //实例方法
      console.log('run');
    }  
  }
  speak(){    //实例方法
    console.log('speak');
  }  
  static speak(){    //类的方法
    console.log('static speak')
  }   
}
Person.version = '1.0';  //类的属性

class Programmer extends Person{
  constructor(name){
    super(name) //一定要调用父类的构造方法
  }
}

const zs = new Programmer('zs');
console.log(zs.name); // zs
zs.run();             //run
zs.speak();           //speak
Programmer.speak();   //static speak
console.log(Programmer.version);  //'1.0'

2.改写继承的属性或方法
同名覆盖

class Programmer extends Person{
  constructor(name){
    super(name) //一定要调用父类的构造方法,且js规定了this操作不能放在super前面
  }
  //同名覆盖
  speak(){
    console.log(`Programmer speak`);
  }
  static speak(){    //类的方法
    console.log('static Programmer speak')
  } 
}
Programmer.version = '2.0';

3.super
3.1可以作为函数调用
此时代表父类的构造方法constructor,只能在子类的构造方法中,用在其他的地方就会报错

//super虽然代表了父类的构造方法,但是内部的this指向子类的实例
class Person{
  constructor(name){
    this.name = name;
    console.log(this);
  }
}
class Programmer extends Person{
  constructor(name){
    super(name) 
  }
}
const zs = new Programmer('zs'); //输出的super函数中的this指向Programmer实例对象

3.2也可以作为对象使用

//1.在构造方法中使用或一般方法中使用
//super代表父类的原型对象Person.prototype
//所以定义在父类实例上的方法或属性,是无法通过super调用的
//通过super调用父类的方法时,方法内部的this指向当前的子类实例
class Person{
  constructor(name){
    this.name = name;
  }
  speak(){
    console.log('speak');
    console.log(this);
  }
}
class Programmer extends Person{
  constructor(name){
    super(name) 
    super.speak() //speak  this指向子类Programmer实例对象
    console.log(super.name) //undefined  因为name属性不在原型对象prototype上,而是在实例上
  }
}
const zs = new Programmer('zs');
//===========================================================================
//super在静态方法中使用
class Person{
  constructor(name){
    this.name = name;
  }
  speak(){
    console.log('speak');
    console.log(this);
  }
  static speak(){
    console.log('Person static speak');
    console.log(this);
  }
}
class Programmer extends Person{
  constructor(name){
    super(name) 
  }
  static speak(){
    //在静态方法中使用 
    //super指向父类,而不是父类的原型对象 否则就变成实例的speak()了
    //通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类实例或者父类
    super.speak();
    console.log('Programer static speak');
  }
}
Programmer.speak(); //Person static speak
                    //this指向子类
                    //Programer static speak


3.3 super的注意事项
使用super的时候,必须显式指定是作为函数还是作为对象使用,否则会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值