JS实现继承的几种方式
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
该方法由于中间函数是空对象,所以几乎不占内存,性能较高