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 相关文章推荐
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
在javascript中执行任意html代码的方法示例解读
Dec 25 Javascript
javascript实现的闭包简单实例
Jul 17 Javascript
jQuery ajax提交Form表单实例(附demo源码)
Apr 06 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
js实现京东轮播图效果
Jun 30 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
jQuery实现每日秒杀商品倒计时功能
Sep 06 jQuery
Vue.js标签页组件使用方法详解
Oct 19 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
jquery插件实现轮播图效果
Oct 19 jQuery
微信小程序实现卡片左右滑动效果的示例代码
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实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
php-fpm中max_children的配置
2019/03/15 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
angularJS开发注意事项
2018/05/26 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
python实现保存网页到本地示例
2014/03/16 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
python实现代码审查自动回复消息
2021/02/01 Python
美国在线印刷公司:PsPrint
2017/10/12 全球购物
公益广告标语
2014/06/19 职场文书
运动会广播稿100字
2014/09/14 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Pandas搭配lambda组合使用详解
2022/01/22 Python
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS