浅谈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 相关文章推荐
Prototype使用指南之string.js
Jan 10 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
May 07 Javascript
Javascript中的var_dump函数实现代码
Sep 07 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
JavaScript常用代码书写规范的超全面总结
Sep 11 Javascript
vuex实现简易计数器
Oct 27 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
jquery UI Datepicker时间控件冲突问题解决
Dec 16 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
VUEX-action可以修改state吗
Nov 19 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 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 第二节 数据类型之字符串类型
2012/04/28 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
PHP7修改的函数
2021/03/09 PHP
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
python简单操作excle的方法
2018/09/12 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
基层党员公开承诺书
2014/05/29 职场文书
施工安全责任协议书
2016/03/23 职场文书