[js高手之路]寄生组合式继承的优势
在之前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高手之路]寄生组合式继承的优势相关推荐
- [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...
- [js高手之路]从原型链开始图解继承到组合继承的产生
于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 1 ...
- JS继承之寄生组合式继承
所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法. 组合继承弥补了原型链和盗用构造函数的不足,是js中使用最多的继承模式. 实现思路: 不必为了指定子类型的原型而调用父 ...
- JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承
一.原型式继承函数 回顾一下JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法. 最终的目的:student对象的原型指向了person对象: 二.寄生式继承函数 寄生式(Para ...
- JS基础--组合继承,寄生组合式继承
以下内容总结自<JavaScript高级程序设计(第3版)> 一. 组合继承 组合继承使用原型链实现对原型属性和方法的继承,使用借用构造函数实现对实例属性的继承(引用类型的属性写在构造函数 ...
- [js高手之路]打造通用的匀速运动框架
本文,是接着上文[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)继续的,在这篇文章的最后,我们做了2个小实例:侧边栏与改变透明度的淡入淡出效果,本文我们把上文的animate函数,继续改造,让他 ...
- [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- [js高手之路] html5 canvas系列教程 - 线条样式(lineWidth,lineCap,lineJoin,setLineDash)
上文,写完弧度与贝塞尔曲线[js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具),本文主要是关于线条的样式设置 lineWidth: 设置线条的宽 ...
最新文章
- 【C#】Web页面传值小结-
- OpenStack 虚拟机热迁移流程图
- c#解析json字符串数组_C#解析JSON字符串总结
- android 9.0 权限管理_你真的了解Android权限机制吗?
- 一个小例子介绍Obj-C的函数命名方式
- Smart ORM v0.3发布(完全面向对象的轻量级ORM工具)
- Nginx1.10编译安装
- Python 查询 MAC 地址相关信息
- Web前端开发工程师需要掌握哪些核心技能?
- 郝斌C语言开篇 C语言简介
- PCI、PCIE、PIC
- 考研英语七附双语阅读:编程玩具——程序员培养从娃娃抓起
- 快手 (kuaishou.net) 2.6 发布
- Python | OpenCV画图显示为一个全黑画布的情况
- windows系统镜像里的×64和×86有什么区别?
- 攒机需要注意的8条技巧 转太平洋网
- Committer identity unknown *** Please tell me who you are...
- Binggo公开课 “CODEX创新体系”的实战演练-中关村创业大街
- JavaScript设计模式----单例模式
- iqooneo3 如何不用vivo账号下载外部应用_1分钟教你学会vivo旧手机数据如何迁移到新手机...
热门文章
- Android与服务器端数据交互(基于SOAP协议整合android+webservice)
- 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
- 耦合式是什么意思_高内聚 ,低耦合 到底是什么意思?
- docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
- java list最大容量_Java 性能优化:35 个小细节,提升你的 Java 代码运行效率
- win10千万不要重置_DELL戴尔电脑WIN10升级后没有声音
- linux系统里常用的抓图工具,Linux系统下屏幕截图常用方法
- linux搜索含多个字符串,使用grep搜索多个字符串
- 字节跳动测试开发4轮面试_字节跳动2018招聘测试开发方向(第四批)
- 12天背诵楞严咒的技巧_背诵楞严咒的技巧