深入浅出理解javaScript原型链


Posted in Javascript onMay 09, 2015

本文实例讲述了javaScript的原型链。分享给大家供大家参考。具体分析如下:

对于javascript原型链,以前都觉得是个很深的东西,一直没有理解很明白,今天看了一些介绍后,发现这张图,表示再没有什么语言能比这张图说得清楚了。

看了这张图后突然对javascript有了质的理解。

深入浅出理解javaScript原型链

javascript的原型链有显式和隐式两种:

显式原型链:即我们常见的prototype;

隐式原型链:在一般环境下无法访问,即不可见,在FireFox下可以通过__proto__方式访问;隐式原型链用于javascript引擎内部对原型链的搜寻,通过显示原型链来设置;
 
一、prototype和__proto__的概念

prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。

__proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性。

用chrome和FF都可以访问到对象的__proto__属性,IE不可以。

二、new 的过程

var Person = function(){};
var p = new Person();

new的过程拆分成以下三步:

(1) var p={}; 也就是说,初始化一个对象p
(2) p.__proto__ = Person.prototype;
(3) Person.call(p); 也就是说构造p,也可以称之为初始化p

关键在于第二步,我们来证明一下:

var Person = function(){};
var p = new Person();
alert(p.__proto__ === Person.prototype);

这段代码会返回true。说明我们步骤2是正确的。

三、示例

var Person = function(){};
Person.prototype.sayName = function() {
  alert("My Name is Jacky");
};
Person.prototype.age = 27;
var p = new Person();
p.sayName();

p是一个引用指向Person的对象。我们在Person的原型上定义了一个sayName方法和age属性,当我们执行p.age时,会先在this的内部查找(也就是构造函数内部),如果没有找到然后再沿着原型链向上追溯。

这里的向上追溯是怎么向上的呢?这里就要使用__proto__属性来链接到原型(也就是Person.prototype)进行查找。最终在原型上找到了age属性。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
Aug 28 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
深入浅析JavaScript中的Function类型
Jul 09 Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 Javascript
vue-cli如何引入bootstrap工具的方法
Oct 19 Javascript
浅析为什么a="abc" 不等于 a=new String("abc")
Oct 25 Javascript
深入浅析vue组件间事件传递
Dec 29 Javascript
Vue 父子组件的数据传递、修改和更新方法
Mar 01 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 Javascript
JavaScript实现滑块验证解锁
Jan 07 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 #Javascript
JS动画效果打开、关闭层的实现方法
May 09 #Javascript
js实现顶部可折叠的菜单工具栏效果实例
May 09 #Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
May 09 #Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
May 09 #Javascript
javasript实现密码的隐藏与显示
May 08 #Javascript
jquery实现动态改变div宽度和高度
May 08 #Javascript
You might like
php 用sock技术发送邮件的函数
2007/07/21 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
Python os模块常用方法和属性总结
2020/02/20 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
python Scrapy框架原理解析
2021/01/04 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
三八节标语
2014/06/27 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
分居协议书范本
2014/11/03 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
大学生党性分析材料
2014/12/19 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android