1:原型链继承

function parent(){}
parent.prototype={}
funcation child(){}
//继承父类
child.prototype = new parent();
//现在用的更多的是 child.prototype= Object.create(parent.prototype);
//注意:不能用child.peototype=parent.prototype,因为一旦修改子类的原型属性会污染父类的原型属性
//重新指定子类的构造器,不然构造器会指向父类
child.prototype.constructor = child;

特点:

  • 实例是子类的实例,也是父类的实例
  • 父类新增原型方法/原型属性,子类都能访问到

缺点:

  • 无法实现多继承,修改父类原型会影响子类,
  • 创建子类实例时,无法向父类构造函数传参
  • 由于重新new了一个parent,消耗内存

2:构造继承

function child(){
    parent.call(this)
}

特点:

  • 创建子类实例时,可以向父类传递参数
  • 可以实现多继承(call多个父类对象)

缺点:

  • 只能继承父类的实例属性和方法,不能继承原型属性/方法
  • 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

3:拷贝继承

function child(){
  var parent= new parent();
  for(var p in parent){
    child.prototype[p] = parent[p];
  }
}

特点:

  • 支持多继承

缺点:

  • 效率较低,内存占用高(因为要拷贝父类的属性)
  • 无法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到)

4:新建中间函数继承(推荐)

// 创建一个没有实例方法的类
var Super = function(){};
Super.prototype = parent.prototype;
//将实例作为子类的原型
child.prototype = new Super();
child.prototype.constructor = child

该方法由于中间函数是空对象,所以几乎不占内存,性能较高