浅谈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 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
Jul 09 Javascript
Js Jquery创建一个弹出层可加载一个页面
May 08 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
如何用RxJS实现Redux Form
Dec 29 Javascript
JS实现判断数组是否包含某个元素示例
May 24 Javascript
vue实现的封装全局filter并统一管理操作示例
Feb 02 Javascript
小程序自动化测试的示例代码
Aug 11 Javascript
JavaScript 事件捕获冒泡与捕获详情
Nov 11 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
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
Python全局变量操作详解
2015/04/14 Python
Python对象转JSON字符串的方法
2016/04/27 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python实现大文件分割与合并
2019/07/22 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Python通过文本和图片生成词云图
2020/05/21 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
办理居住证介绍信
2014/01/15 职场文书
企业授权委托书范本
2014/04/02 职场文书
法定代表人授权委托书
2014/04/04 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python