深入浅出理解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 相关文章推荐
javascript 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 Javascript
JavaScript代码复用模式实例分析
Dec 02 Javascript
Jquery post传递数组方法实现思路及代码
Apr 28 Javascript
jQuery读取和设定KindEditor值的方法
Nov 22 Javascript
纯css下拉菜单 无需js
Aug 15 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
浅析vue-router原理
Oct 19 Javascript
JS中min函数实例讲解
Feb 18 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
Apr 27 Javascript
原生JS实现微信通讯录
Jun 18 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 将excel导入mysql
2009/11/09 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
python连接池实现示例程序
2013/11/26 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
美发店5.1活动方案
2014/01/24 职场文书
驾驶员岗位职责
2014/01/29 职场文书
申论倡议书范文
2014/05/13 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书