深入浅出理解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 web对话框与弹出窗口
Feb 22 Javascript
javaScript如何跳出多重循环break、continue
Sep 01 Javascript
详解Vue.js动态绑定class
Dec 20 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
May 11 Javascript
基于AngularJS的简单使用详解
Sep 10 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
Sep 23 Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 Javascript
element-ui中按需引入的实现
Dec 25 Javascript
JS继承定义与使用方法简单示例
Feb 19 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
中东人咖啡哲学
2021/03/03 咖啡文化
php date与gmdate的获取日期的区别
2010/02/08 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php动态函数调用方法
2015/05/21 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
让您的菜单不离网站
2006/10/03 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
Angular路由ui-router配置详解
2018/08/01 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python实现图片滑动式验证识别方法
2017/11/09 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
python中常见错误及解决方法
2020/06/21 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
护士求职推荐信范文
2013/11/23 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
单位租房协议范本
2014/12/03 职场文书
班主任经验交流材料
2014/12/16 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书