一. 原型链继承
function parent(){};
function son(){};
son.prototype = new parent();
原理: 子类的原型对象指向父类的实例。
缺点: 1. 子类实例共享子类原型对象的引用属性。
2.创建子类的时候不能向父类构造函数传参。
二. 构造函数继承
function parent(){}
function son(name) {
parent.call(this, name);
}
原理: 单纯的使用call将父类的this指向子类,执行父类构造函数。
缺点: 1. 子类的实例无法实现公共属性(功能函数)的复用,造成内存浪费。
三. 组合继承(原型链继承+构造函数继承)
function parent(){}
function son(name){
parent.call(this, name); // 构造继承
}
son.prototype = new parent(); // 原型链继承
son.prototype.constructor = son;
原理: 通过call调用父类构造函数,实现构造函数的继承;通过将子类的原型对象指向父类的实例,实现原型链继承。
缺点: 1. 父类被调用了两次,导致子类实例上有一层属性,而原型对象上也有一层属性,子类实例上的属性屏蔽了其
原型上的属性。 复制代码
四. 寄生组合继承(解决了组合继承中原型中多一份属性的缺点)
function getPrototype(obj) {
var F = function(){};
F.prototype = obj;
return new F();
}
function parent(){}
function son(name) {
parent.call(this, name); // 构造函数继承
}
var prototypeObj = getPrototype(parent.prototype); // 生成一个obj;
son.prototype = prototypeObj; // 将son的原型对象指向上述的obj对象。
son.prototype.constructor = son;
或者
function parent(){}
function son(name) {
parent.call(this, name); // 构造函数继承
}
son.prototype = Object.create(parent.prototype);
son.prototype.constructor = son;
复制代码