寄生组合式继承

2018-06-02  本文已影响0人  樱木夜访流川枫

组合式继承:

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
}

寄生组合式继承只调用了一次父类型构造函数,因此避免了在子类型的原型上创建不必要的属性。它没有原型链继承、原型式继承存在的引用类型值的原型属性共享问题、子类型实例对象到父类型构造函数的传参问题,也没有借用构造函数存在的函数不复用问题、父类型的原型方法对子类型不可见问题,没有组合继承存在的子类型原型会创建不必要的属性问题,没有寄生式继承存在的函数不复用问题。

上一篇 下一篇

猜你喜欢

热点阅读