深入浅出理解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 相关文章推荐
ie6下png图片背景不透明的解决办法使用js实现
Jan 11 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
JavaScript reduce和reduceRight详解
Oct 24 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
jQuery实现动态删除LI的方法
May 30 jQuery
基于Vue单文件组件详解
Sep 15 Javascript
Vue SPA单页应用首屏优化实践
Jun 28 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&&mysql)二
2006/10/09 PHP
杏林同学录(四)
2006/10/09 PHP
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
python八大排序算法速度实例对比
2017/12/06 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
职高毕业生自我鉴定
2013/10/21 职场文书
预备党员转正思想汇报
2014/01/12 职场文书
幼儿园中班新学期寄语
2014/01/18 职场文书
高中运动会广播稿
2014/01/21 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
销售员岗位职责
2014/06/09 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
财政局长个人总结
2015/03/04 职场文书
银行稽核岗位职责
2015/04/13 职场文书
交通事故案件代理词
2015/05/23 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python