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 相关文章推荐
jscript之List Excel Color Values
Jun 13 Javascript
JQuery 选项卡效果(JS与HTML的分离)
Apr 01 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
Jul 22 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
JavaScript表达式:URL 协议介绍
Mar 10 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
Vue中的数据监听和数据交互案例解析
Jul 12 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
Jul 31 Javascript
vue父组件通过props如何向子组件传递方法详解
Aug 16 Javascript
基于VUE的v-charts的曲线显示功能
Oct 01 Javascript
简单了解前端渐进式框架VUE
Jul 20 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
PHP函数积累总结
2019/03/19 PHP
jquery下json数组的操作实现代码
2010/08/09 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
Python 实现进度条的六种方式
2021/01/06 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
工作总结与自我评价
2014/09/18 职场文书
创业计划书之家教中心
2019/09/25 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js