浅谈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 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
jQuery替换textarea中换行的方法
Jun 10 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
Aug 31 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
vue router+vuex实现首页登录验证判断逻辑
May 17 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
js实现无缝轮播图特效
May 09 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
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
php生成html文件方法总结
2014/12/01 PHP
php程序内部post数据的方法
2015/03/31 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Python+django实现简单的文件上传
2016/08/17 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Python实现完整的事务操作示例
2017/06/20 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python判断设备是否联网的方法
2018/06/29 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
python调用摄像头拍摄数据集
2019/06/01 Python
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
工业设计专业推荐信
2013/10/29 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
毕业典礼致辞
2015/07/29 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
MySQL索引失效场景及解决方案
2022/07/23 MySQL