JavaScript 面向对象的程序设计(二)

继续上一周的面向对象设计, 我们就差最后两种继承的方法还没总结完


寄生式继承

书中: 寄生式继承是与原型式继承紧密相关的一种思路, 它的思路与寄生构造函数模式和工厂模式类似, 即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象, 最后再像真的是他做了所有工作一样返回对象

简单的来说: 就是他的思路就是将原型式继承作为它内部的一个对象增强手段(利用它完成继承之后),再像寄生构造函数那样将新对象返回出来 

// 寄生式继承
function createAnother(obj) {
    var clone = Object.create(obj);    // 原型式继承得到新的构造函数
    clone.speak = function (name) {    // 对新的构造函数再增强
        console.log('你好,我是' + name);
    };
    return clone;
}

寄生组合式继承 (最有效的继承方式)

其实使用这个模式继承主要是因为 组合式继承 有一个问题, 就用上面的组合继承的代码来示范:

// 组合式继承
function SuperType(name) {
    this.name = name;
    this.colors = ['red', 'blue', 'green'];
}

SuperType.prototype.sayName = function () {
    console.log(this.name);
};

function SubType(name, age) {
    SuperType.call(this, name);         // 第二次调用 SuperType()
    this.age = age;
}

SubType.prototype = new SuperType();    // 第一次调用 SuperType()
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function () {
    console.log(this.age);
};

在上面当中 , 当实现继承的时候 , 总共会有两次调用 SuperType, 这样导致两次重写了 name与 age 属性 , 为了避免不必要的麻烦, 我们将使用寄生组合式继承来解决这个问题

function inheritPrototype(subType, superType) {
    var prototype = Object.create(superType.prototype); // 原型继承
    prototype.constructor = subType;                    // 增强对象
    subType.prototype = prototype;                      // 指定对象
}

function SuperType(name) {
    this.name = name;
}

SuperType.prototype.sayName = function () {
    console.log(this.name);
};

function SubType(name, age) {
    SuperType.call(this, name);     // 借用构造
    this.age = age;
}

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function () {
    console.log(this.age);
};

var sub1 = new SubType('yang', 1);
console.log(SubType.prototype)
sub1.sayAge();
sub1.sayName();

inheritPrototype当中, 用原型式继承创建一个新的(SuperType的)原型对象 , 并对其增强(将构造器指针指向SubType), 最后再将SubType的 原型指针指向 新的原型对象

相对于组合继承, 它没有用传统的原型链继承实现继承, 而是通过原型式继承, 得到一个SuperType的 原型对象, 并在这个原型对象做继承增强 , 避免多次调用SuperType 

通过这种寄生组合式继承, 高效率地体现在每次实例对象时仅调用一次SuperType , 避免了多次调用SuperType 去创建不必要多余的属性, 与此同时, 原型链还能保持不变, 因此可以正常使用 instanceof 和 isPrototypeOf  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值