JavaScript简餐——寄生组合继承
文章目录
- 前言
- 一、什么是寄生组合继承?
- 二、寄生组合继承的基本模式
- 三、总结
前言
写本《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简餐——寄生组合继承相关推荐
- JavaScript简餐——原型式继承
文章目录 前言 一.什么是原型式继承? 二.ECMAScript5中的原型式继承 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript ...
- JavaScript简餐——关于寄生式继承
文章目录 前言 一.什么是寄生式继承? 二.使用实例 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...
- Javascript简餐——组合继承是个啥
文章目录 前言 一.什么是组合继承? 二.使用实例 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...
- JavaScript面向对象——深入理解寄生组合继承
JavaScript面向对象--深入理解寄生组合继承 之前谈到过组合继承,会有初始化两次实例方法/属性的缺点,接下来我们谈谈为了避免这种缺点的寄生组合继承 寄生组合继承: 思路:组合继承中,构造函数继 ...
- JavaScript简餐——关于类的继承
文章目录 前言 一.继承基础 二.super关键字 三.抽象基类 四.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第 ...
- JavaScript简餐——继承之原型链继承
文章目录 前言 一.实现方式 二.继承实例 三.问题所在 1.引用值误修改 2.子类型实例化时无法给父类构造函数传参 四.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在 ...
- JavaScript简餐——关于盗用构造函数
文章目录 前言 一.什么是盗用构造函数? 二.使用实例 三.参数传递 四.盗用构造函数的问题所在 五.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<Ja ...
- JavaScript简餐——类构造函数
文章目录 前言 一.类的构造函数及其实例化 二.把类当成特殊函数 三.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第 ...
- JavaScript简餐——原型链是什么?
文章目录 前言 一.原型链 二.原型链示例 二.示例图解 总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序设计(第4版)> ...
最新文章
- 为什么分散刷新没有死时间_分散项目为何失败(以及如何处理)
- 配置内存中OLTP文件组提高性能
- 密码强弱度检测万能插件
- Codeforces 785 D.Anton and School - 2(组合数处理)
- 解决使用个推后背景音乐音量变小问题
- 网易云信12月大事记
- 计算机组成原理【随堂练习】
- Mr.J--树的遍历方式详解
- 微课|中学生可以这样学Python(8.4节):递归算法例题讲解3
- Linux系统关机重启,登录root用户,图形界面和字符界面,创建用户,删除用户,查看虚拟控制台用户,切换虚拟控制台
- matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
- 计算机电源输出定义,电脑电源接口定义图解
- 中国柔性材料行业发展建议及竞争态势研究报告2021年版
- 通过命令完成 虚拟机 ubuntu 中的文件拷贝到主机
- 16天记住7000考研单词(784个句子版本) 实际单词4369
- 初窥Deno 1.0面纱
- cf I - Irrational Division
- 2022智源大会议程丨类脑计算前沿与挑战
- Crust Network 与京湘豫等地区块链名企、投资人考察广西区块链科创园
- 互联网协议-简单理解和介绍