javascript原型链学习记录之继承实现方式分析


Posted in Javascript onMay 01, 2019

本文实例讲述了javascript原型链学习记录之继承实现方式。分享给大家供大家参考,具体如下:

在慕课网学习继承的笔记:

继承的几种方式:

① 使用构造函数实现继承

function Parent(){
  this.name = 'parent';
}
function Child(){
Parent.call(this); //在子类函数体里面执行父类的构造函数
this.type = 'child';//子类自己的属性
}

Parent.call(this),this即实例,使用this执行Parent方法,那么就用this.name = 'parent'把属性

挂载在了this(实例)上面,以此实现了继承。

缺点:以上只是让Child得到了Parent上的属性,Parent的原型链上的属性并未被继承。

② 使用原型链实现继承

function Parent(){
  this.name = 'parent';
}
function Child(){
  this.type = 'child';
}
Child.prototype = new Parent();

解释:Child.prototype === Chlid实例的__proto__ === Child实例的原型

所以当我们引用new Child().name时,Child上没有,然后寻找Child的原型child.__proto__Child.prototypenew Parent(),Parent的实例上就有name属性,所以Child实例就在原型链上找到了name属性,以此实现了继承。

缺点:可以看出,Child的所有实例,它们的原型都是同一个,即Parent的实例:

var a = new Child();
var b = new Child();
a.__proto === b.__proto__; //true

所以,当使用 a.name = 'a'重新给name赋值时,b.name也变成了'a',反之亦然。

用instanceof和constructor都无法确认实例到底是Child的还是Parent的。

③ 结合前两种取长补短

function Parent(){
  this.name = 'parent';
}
function Child(){
  Parent.call(this);
  this.type = 'child';
}
Child.prototype = new Parent();

缺点:在Child()里面用Parent.call(this);执行了一次Parent(),然后又使用Child.prototype = new Parent()执行了一次Parent()。

改进1:

function Parent(){
  this.name = 'parent';
}
function Child(){
  Parent.call(this);
  this.type = 'child';
}
Child.prototype = Parent.prototype;

缺点:用instanceof和constructor都无法确认实例到底是Child的还是Parent的。

原因: Child.prototype = Parent.prototype直接从Parent.prototype里面拿到constructor,即Parent。

改进2:

function Parent(){
  this.name = 'parent';
}
function Child(){
  Parent.call(this);
  this.type = 'child';
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

画图说明吧:

var a = new Child();

javascript原型链学习记录之继承实现方式分析

所以这样写我们就构造出了原型链。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 一个函数对同一元素的多个事件响应
Jul 25 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
js判断选择时间不能小于当前时间的示例代码
Sep 24 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
javascript实现数独解法
Mar 14 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
Jun 14 Javascript
深入理解JavaScript 参数按值传递
May 24 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
微信小程序实现卡片左右滑动效果的示例代码
May 01 #Javascript
微信小程序常见页面跳转操作简单示例
May 01 #Javascript
浅谈对于react-thunk中间件的简单理解
May 01 #Javascript
vue增加强缓存和版本号的实现方法
May 01 #Javascript
vue组件化中slot的基本使用方法
May 01 #Javascript
Vue基本使用之对象提供的属性功能
Apr 30 #Javascript
原生JS实现随机点名项目的实例代码
Apr 30 #Javascript
You might like
php中文字符串截取多种方法汇总
2016/10/06 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
javascript中的括号()用法小结
2014/04/14 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python 中的 else详解
2016/04/23 Python
python paramiko模块学习分享
2017/08/23 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python实现横向拼接图片
2020/03/23 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
如何利用python 读取配置文件
2021/01/06 Python
事业单位个人应聘自荐信
2013/09/21 职场文书
小学生评语集锦
2014/04/18 职场文书
工商管理自荐书
2014/07/06 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
python中opencv实现图片文本倾斜校正
2021/06/11 Python
详解Python函数print用法
2021/06/18 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python