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