es6继承:

//class 相当于es5中构造函数
//class中定义方法时,前后不能加function,全部定义在class的protopyte属性中
//class中定义的所有方法是不可枚举的
//class中只能定义方法,不能定义对象,变量等
//class和方法内默认都是严格模式
//es5中constructor为隐式属性

class People{
  constructor(name='wang',age='27'){
    this.name = name;
    this.age = age;
  }
  eat(){
    console.log(`${this.name} ${this.age} eat food`)
  }
}
//继承父类
class Woman extends People{ 
   constructor(name = 'ren',age = '27'){ 
     //继承父类属性
     super(name, age);
​
 } 
    eat(){ 
     //继承父类方法
      super.eat() 
    } 
} 
let wonmanObj=new Woman('xiaoxiami'); 
wonmanObj.eat();

​ 

原型链继续;父类的实例作为子类的原型

function People(name){
  //属性
  this.name  = name || Annie
  //实例方法
  this.sleep=function(){
    console.log(this.name + '正在睡觉')
  }
}
//原型方法
People.prototype.eat = function(food){
  console.log(this.name + '正在吃:' + food);
}
function Woman(){ 
}
Woman.prototype= new People();
Woman.prototype.name = 'haixia';
let womanObj = new Woman();

 

优点:简单易于实现,父类的新增的实例与属性子类都能访问

缺点:无法实现多继承,创建子类实例时,不能向父类构造函数中传参数

 

构造函数:

复制父类的实例属性给子类

function Woman(name){
 //继承了People
  People.call(this); //People.call(this,'wangxiaoxia'); 
  this.name = name || 'renbo'
}
let womanObj = new Woman();

 

优点:解决了子类构造函数向父类构造函数中传递参数,可以实现多继承(call或者apply多个父类)

缺点:方法都在构造函数中定义,无法复用;不能继承原型属性/方法,只能继承父类的实例属性和方法

js之继承

相关文章: