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模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
JQuery for与each性能比较分析
May 14 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
vue中axios解决跨域问题和拦截器的使用方法
Mar 07 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
Jul 18 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
Mar 14 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
javascript面向对象创建对象的方式小结
Jul 29 Javascript
JS实现轮播图效果
Jan 11 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
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
Web开发之JavaScript
2012/03/29 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
浅谈微信小程序flex布局基础
2018/09/10 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
js实现简单的秒表
2020/01/16 Javascript
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
python3中str(字符串)的使用教程
2017/03/23 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python连接字符串过程详解
2020/01/06 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
小学教研工作制度
2014/01/15 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
家长意见书
2015/06/04 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电