浅谈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 相关文章推荐
jquery 插件学习(六)
Aug 06 Javascript
js 获取计算后的样式写法及注意事项
Feb 25 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 Javascript
Angular2 组件交互实例详解
Aug 24 Javascript
如何抽象一个Vue公共组件
Oct 17 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
JQuery Ajax执行跨域请求数据的解决方案
Dec 10 jQuery
微信小程序图表插件wx-charts用法实例详解
May 20 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
Javascript webpack动态import
Apr 19 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
Protoss兵种对照表
2020/03/14 星际争霸
重置版游戏视频
2020/04/09 魔兽争霸
全文搜索和替换
2006/10/09 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
python根据出生日期获得年龄的方法
2015/03/31 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
Python super()函数使用及多重继承
2020/05/06 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
双创工作实施方案
2014/03/26 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
聘任书范文大全
2015/09/21 职场文书