深入浅出理解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 相关文章推荐
js切换div css注意的细节
Dec 10 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
AngularJS教程之环境设置
Aug 16 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
vue单页开发父子组件传值思路详解
May 18 Javascript
JS伪继承prototype实现方法示例
Jun 20 Javascript
vue-router传递参数的几种方式实例详解
Nov 13 Javascript
Vue项目history模式下微信分享爬坑总结
Mar 29 Javascript
JavaScript 作用域实例分析
Oct 02 Javascript
AngularJS动态生成select下拉框的方法实例
Nov 17 Javascript
我所理解的JavaScript中的this指向
Sep 04 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中require和include路径问题详解
2014/12/25 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
django使用LDAP验证的方法示例
2018/12/10 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
python__name__原理及用法详解
2019/11/02 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
通俗讲解python 装饰器
2020/09/07 Python
python 检测图片是否有马赛克
2020/12/01 Python
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
奥巴马竞选演讲稿
2014/05/15 职场文书
作风建设剖析材料
2014/10/06 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
Oracle锁表解决方法的详细记录
2022/06/05 Oracle