以下内容总结自《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基础--组合继承,寄生组合式继承相关推荐

  1. [js高手之路]寄生组合式继承的优势

    在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: 1 function Person( uName ){ 2 this.skills = [ 'ph ...

  2. 初学JavaScript:原型继承/盗用构造函数继承/组合继承/寄生式继承/原型式继承/寄生组合式继承

    文章目录 继承 简介 1.原型链继承 默认原型 判断原型与实例间是否为继承关系 原型继承中的方法 原型链的破坏 原型继承的问题 2.盗用构造函数继承 简介 盗用构造函数继承的问题 3.组合继承 简介 ...

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

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

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

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

  5. 【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式

  6. JS面向对象编程之:封装、继承、多态

    一.封装 (1)封装通俗的说,就是我有一些秘密不想让人知道,就通过私有化变量和私有化方法,这样外界就访问不到了.然后如果你有一些很想让大家知道的东西,你就可以通过this创建的属性看作是对象共有属性和 ...

  7. JS基础面试题一(原型)

    原型 原型 JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象 构造函数通过new创建出来的实例对象,有个_ proto _ 属性指向它的原型 prototype可 ...

  8. 【JS继承】JS继承之寄生式继承

    自我介绍:大家好,我是吉帅振的网络日志:微信公众号:吉帅振的网络日志:前端开发工程师,工作4年,去过上海.北京,经历创业公司,进过大厂,现在郑州敲代码. JS继承专栏 1[JS继承]什么是JS继承? ...

  9. 详细解析JavaScript中的继承(包括组合继承和寄生式继承)

    继承:相信很多学习过Java等面向对象语言的同学,都会接触过继承,它们实现继承的主要方式是接口继承和实现继承.但由于JavaScript函数没有签名,所以无法实现接口继承.ECMAScript支持实现 ...

最新文章

  1. JavaScript检查null与undefined以及==和===之间的差异
  2. Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
  3. JAVA Web.xml 加载顺序
  4. Tomcat6.0启动startup.bat一闪而过
  5. 【机器学习】银行贷款违约预测
  6. zookeeper的设计猜想-Observer角色
  7. boost解析xml文件
  8. 运算符重载——关系运算符重载
  9. 无线传感器网络中低功耗MAC协议—T-MAC
  10. 如何获取区块链开发视频教程资料
  11. 沪江日语频道 » 日语真题
  12. java实验——回文是一种“从前向后读”和“从后向前读”都相同的字符串,如“上海自来水来自海上”。设计一个程序,判断字符串是否是回文。
  13. matlab 7y30,屏幕及音响表现出众_华硕 灵焕3(M3 7Y30/8GB/256GB)_笔记本评测-中关村在线...
  14. 论文分栏前后内容不连续?教你word如何删除分节符
  15. 海量文本中挖掘人物关联关系核心技术介绍-桂洪冠
  16. 15. cookie、session、token
  17. transformer--ViT
  18. mysql内嵌插入语句_MySQL中添加或插入语句(Insert)的几种使用方式
  19. 【MATLAB】遗传算法(GA)求解TSP问题
  20. twitter APi的使用与twitter数据的应用

热门文章

  1. linux环境下创建postgis数据库,Linux下安装Postgis数据库
  2. python成绩区间曲线图_Python重现论文图表之【包含置信区间的折线柱状图】
  3. webservice发请求没有不成功也不返回什么异常_RPC是什么,看完你就知道了
  4. arraylist从大到小排序_为什么插入排序比冒泡排序更受欢迎?
  5. 使用nodejs爬前程无忧前端技能排行(半半成品)
  6. Hibernate双向一对一对象关系模型映射
  7. SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
  8. 以Python为基础的REST(JSON为交换数据)接口的测试框架设计(一)
  9. WinForm如何控制ShowDialog()的返回值,并且可以判断是否会弹出主窗体
  10. VS 2008中PDA开发环境的相关配置