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显示选择目录对话框的代码
Nov 10 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
CSS(js)限制页面显示的文本字符长度
Dec 27 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
兼容FF和IE的动态table示例自写
Oct 21 Javascript
jquery滚动条插件jScrollPane的使用介绍
Nov 08 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
Dec 23 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
React 路由懒加载的几种实现方案
Oct 23 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
微信小程序实现卡片左右滑动效果的示例代码
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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python语言描述KNN算法与Kd树
2017/12/13 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
python打包生成so文件的实现
2020/10/30 Python
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
致铅球运动员加油稿
2014/02/13 职场文书
环保建议书
2014/03/12 职场文书
说明书怎么写
2014/05/06 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
白酒代理协议书范本
2014/10/26 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL