浅谈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 相关文章推荐
js原型链原理看图说明
Jul 07 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
Jan 15 Javascript
JS 操作Array数组的方法及属性实例解析
Jan 08 Javascript
一款由jquery实现的整屏切换特效
Sep 15 Javascript
EasyUi datagrid 实现表格分页
Feb 10 Javascript
jQuery表格插件datatables用法详解
Nov 23 Javascript
js实现图片无缝滚动特效
Mar 19 Javascript
AngularJS过滤器filter用法分析
Dec 11 Javascript
Express URL跳转(重定向)的实现方法
Apr 07 Javascript
JS实现微信摇一摇原理解析
Jul 22 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
vue实现分页栏效果
Jun 28 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
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP学习资料汇总与网址
2007/03/16 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
python 多线程应用介绍
2012/12/19 Python
详解Python中列表和元祖的使用方法
2015/04/25 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
以太网Ethernet IEEE802.3
2013/08/05 面试题
编辑找工作求职信分享
2014/01/03 职场文书
网络编辑职责
2014/03/01 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
护林员个人总结
2015/03/04 职场文书
七年级作文之我的梦想
2019/10/16 职场文书