浅谈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 相关文章推荐
javascript 控制 html元素 显示/隐藏实现代码
Sep 01 Javascript
在vs2010中调试javascript代码方法
Feb 11 Javascript
javascript日期转换 时间戳转日期格式
Nov 05 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
href下载文件根据id取url并下载
May 28 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
微信小程序  checkbox组件详解及简单实例
Jan 10 Javascript
详解Element 指令clickoutside源码分析
Feb 15 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
Jun 17 Javascript
原生js无缝轮播插件使用详解
Mar 09 Javascript
javascript+css实现进度条效果
Mar 25 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实现网站插件机制的方法
2009/11/10 PHP
php通用防注入程序 推荐
2011/02/26 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
php中数组最简单的使用方法
2020/12/27 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
2020/06/17 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
基于python指定包的安装路径方法
2018/10/27 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
python数据分析:关键字提取方式
2020/02/24 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
大专生找工作自荐书
2014/06/10 职场文书
计生工作先进事迹
2014/08/15 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2015年科协工作总结
2015/05/19 职场文书
培训感想范文
2015/08/07 职场文书
八年级历史教学反思
2016/02/19 职场文书