在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承:

 1         function Person( uName ){
 2             this.skills = [ 'php', 'javascript' ];
 3             this.userName = uName;
 4         }
 5         Person.prototype.showUserName = function(){
 6             return this.userName;
 7         }
 8         function Teacher ( uName ){
 9             Person.call( this, uName );
10         }
11         Teacher.prototype = new Person();
12
13         var oT1 = new Teacher( 'ghostwu' );
14         oT1.skills.push( 'linux' );
15         var oT2 = new Teacher( 'ghostwu' );
16         console.log( oT2.skills ); //php,javascript
17         console.log( oT2.showUserName() ); //ghostwu

组合继承有个缺点,父类的构造函数会被调用两次.

第11行,设置子类原型对象(prototype),调用了第一次

第9行,实例化对象的时候,又调用一次

构造函数的目的是为了复制属性,第9行肯定是不能少的,第11行的目的是为了获取到父类原型对象(prototype)上的方法,基于这个目的,有没有别的方法

可以做到 在不需要实例化父类构造函数的情况下,也能得到父类原型对象上的方法呢? 当然可以,我们可以采用寄生式继承来得到父类原型对象上的方法

 1         function Person( uName ){
 2             this.skills = [ 'php', 'javascript' ];
 3             this.userName = uName;
 4         }
 5         Person.prototype.showUserName = function(){
 6             return this.userName;
 7         }
 8         function Teacher ( uName ){
 9             Person.call( this, uName );
10         }
11
12         function object( o ){
13             var G = function(){};
14             G.prototype = o;
15             return new G();
16         }
17
18         function inheritPrototype( subObj, superObj ){
19             var proObj = object( superObj.prototype ); //复制父类superObj的原型对象
20             proObj.constructor = subObj; //constructor指向子类构造函数
21             subObj.prototype = proObj; //再把这个对象给子类的原型对象
22         }
23
24         inheritPrototype( Teacher, Person );
25
26         var oT1 = new Teacher( 'ghostwu' );
27         oT1.skills.push( 'linux' );
28         var oT2 = new Teacher( 'ghostwu' );
29         console.log( oT2.skills ); //php,javascript
30         console.log( oT2.showUserName() ); //ghostwu

其实,说白了寄生组合式继承就是一个借用构造函数 + 相当于浅拷贝父类的原型对象

[js高手之路]寄生组合式继承的优势相关推荐

  1. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  2. [js高手之路]从原型链开始图解继承到组合继承的产生

    于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 1 ...

  3. JS继承之寄生组合式继承

    所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法. 组合继承弥补了原型链和盗用构造函数的不足,是js中使用最多的继承模式. 实现思路: 不必为了指定子类型的原型而调用父 ...

  4. JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承

    一.原型式继承函数 回顾一下JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法. 最终的目的:student对象的原型指向了person对象: 二.寄生式继承函数 寄生式(Para ...

  5. JS基础--组合继承,寄生组合式继承

    以下内容总结自<JavaScript高级程序设计(第3版)> 一. 组合继承 组合继承使用原型链实现对原型属性和方法的继承,使用借用构造函数实现对实例属性的继承(引用类型的属性写在构造函数 ...

  6. [js高手之路]打造通用的匀速运动框架

    本文,是接着上文[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)继续的,在这篇文章的最后,我们做了2个小实例:侧边栏与改变透明度的淡入淡出效果,本文我们把上文的animate函数,继续改造,让他 ...

  7. [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

  8. [js高手之路]原型对象(prototype)与原型链相关属性与方法详解

    一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...

  9. [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)

    上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...

最新文章

  1. 【C#】Web页面传值小结-
  2. OpenStack 虚拟机热迁移流程图
  3. c#解析json字符串数组_C#解析JSON字符串总结
  4. android 9.0 权限管理_你真的了解Android权限机制吗?
  5. 一个小例子介绍Obj-C的函数命名方式
  6. Smart ORM v0.3发布(完全面向对象的轻量级ORM工具)
  7. Nginx1.10编译安装
  8. Python 查询 MAC 地址相关信息
  9. Web前端开发工程师需要掌握哪些核心技能?
  10. 郝斌C语言开篇 C语言简介
  11. PCI、PCIE、PIC
  12. 考研英语七附双语阅读:编程玩具——程序员培养从娃娃抓起
  13. 快手 (kuaishou.net) 2.6 发布
  14. Python | OpenCV画图显示为一个全黑画布的情况
  15. windows系统镜像里的×64和×86有什么区别?
  16. 攒机需要注意的8条技巧 转太平洋网
  17. Committer identity unknown *** Please tell me who you are...
  18. Binggo公开课 “CODEX创新体系”的实战演练-中关村创业大街
  19. JavaScript设计模式----单例模式
  20. iqooneo3 如何不用vivo账号下载外部应用_1分钟教你学会vivo旧手机数据如何迁移到新手机...

热门文章

  1. Android与服务器端数据交互(基于SOAP协议整合android+webservice)
  2. 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
  3. 耦合式是什么意思_高内聚 ,低耦合 到底是什么意思?
  4. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
  5. java list最大容量_Java 性能优化:35 个小细节,提升你的 Java 代码运行效率
  6. win10千万不要重置_DELL戴尔电脑WIN10升级后没有声音
  7. linux系统里常用的抓图工具,Linux系统下屏幕截图常用方法
  8. linux搜索含多个字符串,使用grep搜索多个字符串
  9. 字节跳动测试开发4轮面试_字节跳动2018招聘测试开发方向(第四批)
  10. 12天背诵楞严咒的技巧_背诵楞严咒的技巧