组合式继承:
function Person3(params) {
// 私有属性定义
}
// 复用方法定义
Person3.prototype.fn = function() {
// todo
}
function Man3(params) {
// 借用构造函数继承父类型实例属性
Person3.call(this, params); // 第二次调用
// 增加对象等
}
// 原型链继承父类型的原型属性和方法
Man3.prototype = new Person(); // 第一次调用
var man3 = new Man3()
组合继承的缺点:会调用两次父类型构造函数,在子类型的原型上创造了不必要的、多余的属性
寄生组合式继承:为了解决组合继承的缺陷
所谓寄生组合式继承,即通过借用构造函数
来继承属性
,通过原型链
继承方法
。
它的基本思路:不必为了指定子类型的原型而调用父类型的构造函数,我们所需要的仅仅是父类型的原型的一个副本
。本质上,使用寄生式继承来继承父类型的原型
,再将结果指定给子类型的原型
。
代码实现:
function Person6(params) {
// 私有属性定义
}
// 复用方法定义
Person6.prototype.fn = function() {
// todo
}
function Man6 (params) {
// 借用构造函数来继承属性
Person6.call(this, params);
// 声明自己的私有属性
}
function inheritPrototype(child, parent) {
var clone = object(parent.prototype); // 创建对象
clone.constructor = child; // 增强对象
child.prototype = clone; // 指定对象
}
inheritPrototype(Man6, Person6);
// 子类型定义复用方法
Man6.prototype.fn = function() {
// todo
}
寄生组合式继承只调用了一次父类型构造函数,因此避免了在子类型的原型上创建不必要的属性。它没有原型链继承、原型式继承存在的引用类型值的原型属性共享问题、子类型实例对象到父类型构造函数的传参问题,也没有借用构造函数存在的函数不复用问题、父类型的原型方法对子类型不可见问题,没有组合继承存在的子类型原型会创建不必要的属性问题,没有寄生式继承存在的函数不复用问题。