文章目录

  • 前言
  • 一、什么是寄生组合继承?
  • 二、寄生组合继承的基本模式
  • 三、总结

前言

写本《JavaScript简餐》系列文章的目的是记录在阅读学习《JavaScript高级程序设计(第4版)》一书时出现的各个知识点。虽是对读书的笔记和总结,但是希望它轻量、简洁、犀利,不会引起阅读疲劳,可以在碎片化时间和闲暇之余轻巧地沐浴一下知识点。每篇文章只针对一个小部分进行讲解式的梳理,来达到个人复习总结和分享知识的目的。


一、什么是寄生组合继承?

组合继承其实存在效率问题。(关于组合继承可以看我的上一篇文章《组合继承是个啥》)。最主要的效率问题就是父类构造函数始终会被调用两次:一次是在创建子类原型时调用,另一次是在子类构造函数中调用。但事实上大可不必如此,子类构造函数只要在执行时重写自己的原型就行了。寄生组合继承通过盗用构造函数继承属性,但使用混合式原型链来继承方法。基本思路是不通过调用父类构造函数给子类原型赋值,而是取得父类原型的一个副本。说到底就是使用寄生式继承来继承父类原型(关于寄生式继承可以看我的上一篇文章《关于寄生式继承》),然后将返回的新对象赋值给子类原型。


二、寄生组合继承的基本模式

寄生组合继承的基本模式如以下代码所示:

function inheritPrototype (subType, superType) {let prototype = Object(superType.prototype); // 创建父类原型的一个副本prototype.constructor = subType; // 给返回的对象设置constructor属性subType.prototype = prototype; // 将返回的新对象赋值给子类原型
}

这个inheritPrototype()函数接收两个参数:子类构造函数和父类构造函数。在这个函数内部,第一步是创建父类原型的一个副本。然后,给返回的prototype对象设置constructor属性,解决由于重写原型导致子类原型对象中的默认constructor属性丢失的问题。最后将新创建的对象prototype赋值给子类原型。下面来调用一下这个函数来完成一次继承。

function Person(name) {this.name = name;this.hobbies = ["soccer", "volleyball", "badminton"];
}Person.prototype.sayName = function () {console.log(this.name);
};function Student(name, school) {this.school = school;Person.call(this, name);
}inheritPrototype(Student, Person);let stu = new Student("Lucy", 'Peking University');
console.log(stu.name, stu.hobbies); // Lucy [ 'soccer', 'volleyball', 'badminton' ]
stu.sayName(); // Lucy

这里只调用了一次Person()构造函数,避免了Student.prototype上不必要也用不到的属性,因此可以说这个例子的效率更高。而且,原型链仍然保持不变。寄生组合继承可以算是引用类型继承的最佳模式。


三、总结

以上就是今天要讲的内容,寄生组合继承集组合继承与寄生继承的优点于一身,是比较高效且优雅的继承方式。至此关于继承的篇章告一段落,下一篇开始我们来介绍一下ES6中的Class(类)来开始面向对象编程。撒花~

JavaScript简餐——寄生组合继承相关推荐

  1. JavaScript简餐——原型式继承

    文章目录 前言 一.什么是原型式继承? 二.ECMAScript5中的原型式继承 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript ...

  2. JavaScript简餐——关于寄生式继承

    文章目录 前言 一.什么是寄生式继承? 二.使用实例 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...

  3. Javascript简餐——组合继承是个啥

    文章目录 前言 一.什么是组合继承? 二.使用实例 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...

  4. JavaScript面向对象——深入理解寄生组合继承

    JavaScript面向对象--深入理解寄生组合继承 之前谈到过组合继承,会有初始化两次实例方法/属性的缺点,接下来我们谈谈为了避免这种缺点的寄生组合继承 寄生组合继承: 思路:组合继承中,构造函数继 ...

  5. JavaScript简餐——关于类的继承

    文章目录 前言 一.继承基础 二.super关键字 三.抽象基类 四.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第 ...

  6. JavaScript简餐——继承之原型链继承

    文章目录 前言 一.实现方式 二.继承实例 三.问题所在 1.引用值误修改 2.子类型实例化时无法给父类构造函数传参 四.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在 ...

  7. JavaScript简餐——关于盗用构造函数

    文章目录 前言 一.什么是盗用构造函数? 二.使用实例 三.参数传递 四.盗用构造函数的问题所在 五.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<Ja ...

  8. JavaScript简餐——类构造函数

    文章目录 前言 一.类的构造函数及其实例化 二.把类当成特殊函数 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第 ...

  9. JavaScript简餐——原型链是什么?

    文章目录 前言 一.原型链 二.原型链示例 二.示例图解 总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...

最新文章

  1. 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
  2. 配置内存中OLTP文件组提高性能
  3. 密码强弱度检测万能插件
  4. Codeforces 785 D.Anton and School - 2(组合数处理)
  5. 解决使用个推后背景音乐音量变小问题
  6. 网易云信12月大事记
  7. 计算机组成原理【随堂练习】
  8. Mr.J--树的遍历方式详解
  9. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解3
  10. Linux系统关机重启,登录root用户,图形界面和字符界面,创建用户,删除用户,查看虚拟控制台用户,切换虚拟控制台
  11. matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
  12. 计算机电源输出定义,电脑电源接口定义图解
  13. 中国柔性材料行业发展建议及竞争态势研究报告2021年版
  14. 通过命令完成 虚拟机 ubuntu 中的文件拷贝到主机
  15. 16天记住7000考研单词(784个句子版本) 实际单词4369
  16. 初窥Deno 1.0面纱
  17. cf I - Irrational Division
  18. 2022智源大会议程丨类脑计算前沿与挑战
  19. Crust Network 与京湘豫等地区块链名企、投资人考察广西区块链科创园
  20. 互联网协议-简单理解和介绍

热门文章

  1. 5名员工微信群调侃领导被开除,法院这样判!
  2. linux 下搭建opengl
  3. 蓝牙HC-05 配对过程以及注意事项
  4. 【STM32GPIO的基本理解与使用】
  5. 面试:----电商项目中比较难得问题
  6. Java使用循环嵌套打印九九乘法表
  7. 盖亚游戏数据分析面试总结
  8. Nim游戏,异或解决问题,神证明
  9. 标候选人公示和中标结果公示的区别
  10. PHP面向对象的三大特性