JavaScript: 原型链继承(原理解析 + 代码实现 + 结构图解)
文章目录
- 一 原型搜索机制
- 1.1 代码实现
- 1.2 结构图解
- 1.3 搜索机制
- 二 原型链代码实现
- 2.1 代码实现
- 2.2 结构图解
- 2.3 链条拓展
- 三 原型链的缺点
原型链是实现继承的一种方式,扩展了原型搜索机制,使搜索可以继承向上,搜索原型的原型。
一 原型搜索机制
在原型搜索机制中,构造函数,实例,和原型对象的关系为,原型对象是构造函数的一个属性prototype,原型对象中有一个属性constructor指回构造函数,构造函数生成的实例中具有指针指向构造函数上的原型对象。
1.1 代码实现
// 构造函数
function person(name, color){this.name = name;this.color = color;
}
// 向默认的原型对象中添加值
person.prototype.getColor = function(){return this.color;
}
// 通过构造函数构建实例 实例中含有指向原型对象的指针
var personOne = new person("tom", "red");console.log("来自构造函数中的属性", personOne.name) // "tom"
console.log("来自原型对象中的属性", personOne.getColor()) // "red"
1.2 结构图解
构造函数,原型对象,实例的关系如下。
1.3 搜索机制
当搜索一个属性/方法时,先搜索实例本身,如果实例本身没有找到,再从指针找到其指向的原型对象,向上查找的特性与作用域链相似。
也就是说,如果在实例中设置了要查找的属性名,就不会再向上查找。
... ...
personOne.getColor = function(){return "实例中的属性";
}
console.log(personOne.getColor()); // "实例中的属性"
... ...
这时候如果没找到,并且该原型对象中也有一个指向另一个原型对象的指针,就从指针向上搜索原型的原型,直到原型链的末端,也就是原型不再包含指向另一个原型的指针为止。
二 原型链代码实现
从这里看出,原型链是由指向原型对象的指针将多个原型对象连接起来,上面指出,当我们new一个A实例,实例中就包含一个指向原型对象的指针。
如果我们将该实例赋值为另外一个对象实例B的原型对象,原型链就构成了,查找顺序为。
B实例−>B原型(A实例)−>A原型B实例->B原型(A实例)->A原型 B实例−>B原型(A实例)−>A原型
2.1 代码实现
在下面的代码中,访问objB的实例对象obj时,通过原型链,最终输出了objA的原型对象中的值。
function objA(){this.title = 'A';
}objA.prototype.name = "objA-prototype";function objB(){this.title = 'B';
}objB.prototype = new objA();var obj = new objB;
console.log(obj.name); // objA-prototype
2.2 结构图解
2.3 链条拓展
我们可以通过将B实例替换C对象实例的原型对象的方式来拓展该原型链。拓展后查找顺序为。
C实例−>C原型(B实例)−>B原型(A实例)−>A原型C实例->C原型(B实例)->B原型(A实例)->A原型 C实例−>C原型(B实例)−>B原型(A实例)−>A原型
原型链就是这样实现继承的。
在上面公式中,在C实例向A原型搜索的过程中,只要在某一个地方获得了一个同名属性,就会取该属性,而不再向上搜索,也就是说,在下层原型中添加上层原型链已有的方法会覆盖方法。
三 原型链的缺点
原型链也有一些缺点,如原型链中的属性是共享的,当修改某一个原型对象中的值时,下层所以实例在获取该值时都会变化,因为大家都是通过指针读取原型对象中的值。
由于这种缺陷,一般不单独使用原型链继承。
有一些缺点,如原型链中的属性是共享的,当修改某一个原型对象中的值时,下层所以实例在获取该值时都会变化,因为大家都是通过指针读取原型对象中的值。
由于这种缺陷,一般不单独使用原型链继承。
其他的继承方法请关注本专栏,等待后续文章。
JavaScript: 原型链继承(原理解析 + 代码实现 + 结构图解)相关推荐
- javascript 原型链继承
JavaScript中没有类的概念,只有一个构造函数来创建对象. 但是JavaScript也可以实现继承. 首先要说的是,JavaScript中的对象分为函数对象和普通对象. 何为函数对象?? 就是 ...
- JavaScript 原型链运行原理
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- 图解JavaScript原型链继承
JavaScript是基于原型链的继承的,忘掉类的继承,从原型链入手. 普通对象 函数对象 JavaScrip只有一种结构:对象 通过new Function()创建的对象都是函数对象,其他都是普通对 ...
- JavaScript原型链污染攻击
前言 最近在看js的时候看到p神的一篇关于js原型链污染的文章,学习一下. 下面转自p神:深入理解 JavaScript Prototype 污染攻击 还有一篇案例关于js原型链污染的ctf题:从一道 ...
- ES6 继承(复习原型链继承)
2019独角兽企业重金招聘Python工程师标准>>> 原型链继承 <script type="text/javascript">/* 原型链 继承 ...
- JavaScript进阶学习(二)—— 基于原型链继承的js工具库的实现方法
文章来源:小青年原创 发布时间:2016-07-03 关键词:JavaScript,原型链,jQuery类库 转载需标注本文原始地址: http://zhaomenghuan.github.io... ...
- JavaScript 原型链和继承面试题
JavaScript 原型链和继承问题 JavaScript 中没有类的概念的,主要通过原型链来实现继承.通常情况下,继承意味着复制操作,然而 JavaScript默认并不会复制对象的属性,相反,Ja ...
- 深度解析JavaScript原型链
深度解析JavaScript原型链 文章目录 深度解析JavaScript原型链 前言 JavaScript原型链,这里只分享我自己的见解 一.原型链是什么 二.心得 三图解 总结 前言 JavaSc ...
- JavaScript简餐——继承之原型链继承
文章目录 前言 一.实现方式 二.继承实例 三.问题所在 1.引用值误修改 2.子类型实例化时无法给父类构造函数传参 四.总结 前言 写本<JavaScript简餐>系列文章的目的是记录在 ...
最新文章
- [导入][转]常用CSS缩写语法总结
- 干货 | VMAF视频质量评估在视频云转码中的应用
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
- 为防止员工带薪拉屎,快手公司推出“计时厕所”?官方称只是为了测试!
- CentOS中vsftp安装、配置、卸载
- cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标
- fprom预测结果内容_预测模型之机器学习 Machine Learning结果解读篇
- QT打包后音频不响应的问题
- 耿建超英语语法---陈述句(1)
- rdlc和rdl的区别
- 计算机ppt制作教案,《电脑幻灯我来秀—制作个性母版》教学设计
- 【Web前端】HTML—6.表单标签
- ideal拉代码和提交代码
- python reset_index()_python 问题 reset_index(drop=True
- vue-admin websocket接收消息推送+语音提示(详细代码)
- android9机型,安卓9正式定名Android 9 Pie,这些机型可以尝鲜
- 硬盘三大种类(SSD;HHD;HDD)
- 国籍SQL—— 看自己需求 ( 港澳台 也独立出来了)
- openxml的视频教程
- 盈帆报表软件制作编号报表(报表工具)
热门文章
- 在Word中创建CommandBar并显示winform窗体
- 基于java springboot框架开发机动车驾驶员计时培训监管系统平台
- GIT删除分支命令以及GIT最常用命令总结
- 家长注意!9月开学有这些变化 猿辅导资深教研解读新课标
- 破解索尼PS4系列:利用网页漏洞实现相关的ROP攻击(一)
- 计算机网盘怎么进,教你百度网盘如何进行图文识别?
- word 2007 默认显示缩略图而不是文档结构图
- Python界面编程第十三课:Pyside2 (Qt For Python)GridLayout网格布局
- 计算机图形和ps的区别,【2人回答】PS和PPT有什么区别-3D溜溜网
- php2612如何加墨粉,复印机如何加墨粉 复印机更换粉盒步骤