JS基础--组合继承,寄生组合式继承
以下内容总结自《JavaScript高级程序设计(第3版)》
一. 组合继承
组合继承使用原型链实现对原型属性和方法的继承,使用借用构造函数实现对实例属性的继承(引用类型的属性写在构造函数里)。
示例:
function SuperType (name) {this.name = name;this.colors = ["red", "green", "blue"];
}
SuperType.prototype.sayName = function () {alert(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 () {alert(this.age);
}
根据以上代码,组合继承会调用两次父类构造函数,第一次调用时会将SuperType中的name属性和colors属性写入到SubType的原型中,第二次调用的时候是在创建一个SubType实例的时候,此时会将SuperType中的name属性和colors属性写入到SubType实例中。
相同的属性既被写入了原型中,又被写入了实例中,这是没有必要的。
如何避免两次调用父类构造函数呢?这里使用寄生组合式继承。
二. 寄生组合式继承
function SuperType (name) {this.name = name;this.colors = ["red", "green", "blue"];
}
SuperType.prototype.sayName = function () {alert(this.name);
};
function SubType (name, age) {SuperType.call(this, name); this.age = age;
}// 下面这部分替代给子类原型赋值的过程,不调用父类构造函数,直接继承父类原型
var prototype = Object.create(SuperType.prototype);
prototype.constructor = SubType;
SubType.prototype = prototype;SubType.prototype.sayAge = function () {alert(this.age);
}
附:
Object.create()方法是ES5中原型式继承的规范化。
在只传一个参数时,内部行为如下:
function object (o) {function F() {};F.prototype = o;return new F();
}
JS基础--组合继承,寄生组合式继承相关推荐
- [js高手之路]寄生组合式继承的优势
在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: 1 function Person( uName ){ 2 this.skills = [ 'ph ...
- 初学JavaScript:原型继承/盗用构造函数继承/组合继承/寄生式继承/原型式继承/寄生组合式继承
文章目录 继承 简介 1.原型链继承 默认原型 判断原型与实例间是否为继承关系 原型继承中的方法 原型链的破坏 原型继承的问题 2.盗用构造函数继承 简介 盗用构造函数继承的问题 3.组合继承 简介 ...
- JS继承之寄生组合式继承
所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法. 组合继承弥补了原型链和盗用构造函数的不足,是js中使用最多的继承模式. 实现思路: 不必为了指定子类型的原型而调用父 ...
- JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承
一.原型式继承函数 回顾一下JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法. 最终的目的:student对象的原型指向了person对象: 二.寄生式继承函数 寄生式(Para ...
- 【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式
- JS面向对象编程之:封装、继承、多态
一.封装 (1)封装通俗的说,就是我有一些秘密不想让人知道,就通过私有化变量和私有化方法,这样外界就访问不到了.然后如果你有一些很想让大家知道的东西,你就可以通过this创建的属性看作是对象共有属性和 ...
- JS基础面试题一(原型)
原型 原型 JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象 构造函数通过new创建出来的实例对象,有个_ proto _ 属性指向它的原型 prototype可 ...
- 【JS继承】JS继承之寄生式继承
自我介绍:大家好,我是吉帅振的网络日志:微信公众号:吉帅振的网络日志:前端开发工程师,工作4年,去过上海.北京,经历创业公司,进过大厂,现在郑州敲代码. JS继承专栏 1[JS继承]什么是JS继承? ...
- 详细解析JavaScript中的继承(包括组合继承和寄生式继承)
继承:相信很多学习过Java等面向对象语言的同学,都会接触过继承,它们实现继承的主要方式是接口继承和实现继承.但由于JavaScript函数没有签名,所以无法实现接口继承.ECMAScript支持实现 ...
最新文章
- JavaScript检查null与undefined以及==和===之间的差异
- Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
- JAVA Web.xml 加载顺序
- Tomcat6.0启动startup.bat一闪而过
- 【机器学习】银行贷款违约预测
- zookeeper的设计猜想-Observer角色
- boost解析xml文件
- 运算符重载——关系运算符重载
- 无线传感器网络中低功耗MAC协议—T-MAC
- 如何获取区块链开发视频教程资料
- 沪江日语频道 » 日语真题
- java实验——回文是一种“从前向后读”和“从后向前读”都相同的字符串,如“上海自来水来自海上”。设计一个程序,判断字符串是否是回文。
- matlab 7y30,屏幕及音响表现出众_华硕 灵焕3(M3 7Y30/8GB/256GB)_笔记本评测-中关村在线...
- 论文分栏前后内容不连续?教你word如何删除分节符
- 海量文本中挖掘人物关联关系核心技术介绍-桂洪冠
- 15. cookie、session、token
- transformer--ViT
- mysql内嵌插入语句_MySQL中添加或插入语句(Insert)的几种使用方式
- 【MATLAB】遗传算法(GA)求解TSP问题
- twitter APi的使用与twitter数据的应用
热门文章
- linux环境下创建postgis数据库,Linux下安装Postgis数据库
- python成绩区间曲线图_Python重现论文图表之【包含置信区间的折线柱状图】
- webservice发请求没有不成功也不返回什么异常_RPC是什么,看完你就知道了
- arraylist从大到小排序_为什么插入排序比冒泡排序更受欢迎?
- 使用nodejs爬前程无忧前端技能排行(半半成品)
- Hibernate双向一对一对象关系模型映射
- SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
- 以Python为基础的REST(JSON为交换数据)接口的测试框架设计(一)
- WinForm如何控制ShowDialog()的返回值,并且可以判断是否会弹出主窗体
- VS 2008中PDA开发环境的相关配置