您的位置:首页 > Web前端 > JavaScript

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

2018-07-08 13:11 197 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang52ya7/article/details/80957752

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


寄生式继承

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

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

// 寄生式继承
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  


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐