浅谈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 编写规范
Mar 03 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
Dec 17 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
基于Vue生产环境部署详解
Sep 15 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
Vue实现简易翻页效果源码分享
Nov 08 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 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
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
phalcon框架使用指南
2016/02/23 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
浅析Python基础-流程控制
2016/03/18 Python
Python实现视频下载功能
2017/03/14 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python的移位操作实现详解
2019/08/21 Python
python单例设计模式实现解析
2020/01/07 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
入团者的自我评价分享
2013/12/02 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
欢迎新生标语
2014/10/06 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
党课主持词大全
2015/06/30 职场文书
企业文化学习心得体会
2016/01/21 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android