浅谈JavaScript面向对象--继承


Posted in Javascript onMarch 20, 2019

一、继承的概念

子类共享父类的数据和方法的行为,就叫继承。

二、E55如何实现继承?探索JavaScript继承的本质

2.1构造函数之间的“复制粘贴”

第一条路是通过构造函数来继承,这可以理解为子类直接复制了父类构造函数的代码,然后按照一定的规矩“粘贴”在自己的构造函数中,为己所用。举个例子:

浅谈JavaScript面向对象--继承

如果A要继承B的属性,是不是直接把this.name = name复制粘贴到A函数就可以了?简单粗暴。

所以在A中,直接执行B函数,不就等于执行了this.name = name吗。

浅谈JavaScript面向对象--继承

直接这样尝试下,发现是不行的,这是因为B中的this指向B的实例化对象,A中的this指向A的实例化对象,所以要统一this的指向。

浅谈JavaScript面向对象--继承

这样,就完成了一次合乎规范的构造函数之间的“代码复制粘贴”,也就是继承。这其实也是后面ES6中super关键字的实现原理。

2.2原型链上要“挤进一位来客”

当然,这还是不够的,因为在实际情况中,B这个构造函数还可以拓展一些方法和属性到原型链上,比如:

浅谈JavaScript面向对象--继承

我们在构造函数B中拓展了一个skill方法,发现上面那种“复制粘贴”的方法不好使了对吗?这是因为A的原型链和B的原型链还没有“建立联系”,我们需要在A和B之间搭一座桥,把他们联系起来。

熟悉基本原型链的同学都知道,原型链的“通信”是通过隐式原型(__proto__)来实现的。所以基本原型链是这样的:

浅谈JavaScript面向对象--继承

这就是基本的原型链,现在的情况是,A要继承B的属性和方法,所以B得加入到原型链中,并且,B要在A的上面,所以理想的情况是不是应该像下面这样:

浅谈JavaScript面向对象--继承

实际上我们也确实是这么做的,也就是令A.prototype.__proto__ = B.prototype。

控制台试一下,成功了。

浅谈JavaScript面向对象--继承

总结一下:ES5实现继承需要两步,第一:合乎规范的“代码复制粘贴”;第二,原型链上“搭座桥”。

三、ES6实现继承,其实只是换了种叫法

首先,要明确JavaScript是没有真正“类”的概念的,ES6中的类,就是ES5中构造函数。

浅谈JavaScript面向对象--继承

这件事是很容易验证的,类A的类型打印出来,就是function。

ES6实现类的继承,是不是也要“两步走”呢?答案是肯定的,看看ES6的继承如何实现:

浅谈JavaScript面向对象--继承

其实原理是完全一样的,extends相当于做了A.prototype.__proto__ = B.prototype这件事,而super则相当于执行了ES5中的B.call(this,name)这个操作,只是换个操作的名字向Java靠拢而已。

以上所述是小编给大家介绍的JavaScript面向对象继承详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
JavaScript 高效运行代码分析
Mar 18 Javascript
Javascript的一种模块模式
Sep 08 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
JavaScript中join()方法的使用简介
Jun 09 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
node.js博客项目开发手记
Mar 16 Javascript
Vue数据监听方法watch的使用
Mar 28 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
js实现登录时记住密码的方法分析
Apr 05 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
Mar 20 #Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 #Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 #Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 #Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 #Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 #Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 #Javascript
You might like
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
js获取视频时长代码
2014/04/10 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
Python是编译运行的验证方法
2015/01/30 Python
python监控文件或目录变化
2016/06/07 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
应届生求职推荐信
2013/10/28 职场文书
机电一体化专业应届生求职信
2013/11/27 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
特教教师先进事迹
2014/05/21 职场文书
2015年人事科工作总结
2015/04/28 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL