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
阅读更多
相关文章推荐
- Javascript高级程序设计——面向对象之理解对象
- JavaScript基础——面向对象的程序设计
- JavaScript高级程序设计笔记-面向对象的编程
- 4 javascript 面向对象的程序设计
- 读javascript高级程序设计06-面向对象之继承
- JavaScript高级程序设计之面向对象的程序设计之创建对象之组合使用构造函数模式和原型模式 第6.2.4讲笔记
- JavaScript基础——面向对象的程序设计(一)创建对象的几种方式总结
- JavaScript高级程序设计之面向对象的程序设计之理解对象第6.1讲笔记
- JavaScript高级程序设计【面向对象-创建对象2】
- JavaScript面向对象的程序设计(一)
- JavaScript高级程序设计之面向对象的程序设计之创建对象之寄生构造函数模式 第6.2.6讲笔记
- JavaScript面向对象的程序设计
- js面向对象、原型及继承(javaScript高级程序设计第3版)
- 【javascript高级程序设计】读书摘录3 第六章、面向对象 原型链
- 读javascript高级程序设计05-面向对象之创建对象
- JavaScript高级程序设计之面向对象的程序设计之创建对象之稳妥构造函数模式 第6.2.7讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之借用构造函数第6.3.2讲笔记
- (深夜课堂)Javascript 面向对象的程序设计
- Javascript高级程序设计——面向对象之创建对象
- JavaScript高级程序设计之面向对象的程序设计之创建对象之工厂模式第6.2.1讲笔记