//如有错误或不同观点,欢迎批评与讨论!

首先,prototype出现的目的,是为了解决 代码重用 的问题 , prototype 相当于是在内存上划分出一个公共的区域, 专用于存放 实例化对象 的相同方法或属性, 一份代码,人人可用;

为方便理解,我们可以先把prototype 当作是CSS中的 class,在prototype上加方法和属性,那么其它对象就会拥有这些方法和属性, 但这些代码紧有一份!

<script>
function Person()
{
this.name = '张三';
this.id = function (){ alert('身份证') };
}
Person.prototype.say = function (){ alert('说话'); } var P1 = new Person();
var P2 = new Person(); console.log(P1);
console.log(P2);
console.log(P1.name === P2.name); //true
console.log(P1.id === P2.id); //false
console.log(P1.say === P2.say); //true
</script>

/*---------------------------------------------------------------*/

运行上面代码,从控制台中可以看出:

1.name, id 都是直接放在 new出来的对象上的, 他们的name的比较是相等的(因为字符串是基本类型,所以为true),而id比较 是false,这是因为 function 是复合数据类型,比较的是引用值,这两个 id 分别属于两个不同的对象, 引用不一样,所以为false;

2.我们直接 P1.say() 是可以运行的,但是从控制台可看出,P1和P2并没有say这个方法,这个方法其实是属于 Person.prototype 这个对象的,那为什么P1,P2可以使用这个方法呢?请看下图

3.从控制台中我们还可以看到这样的个东东:_proto_ ; 它就是JS的 原型链 ,我们是访问不了它的, 但是可以在控制台中看到它, 其实 _proto_ 就是将 实例对象 P1、P2 和 类(构造函数)建立起一个联系,通过这个 原型链 可以找到Person.prototype这个内存公共空间里的 所有公共方法和属性; 从上图可以看出, say这个方法正是在里面,  而这个constructor是哪里来的呢? 这个是当我们定义Person函数的时候, 浏览器自动给我们添加的, 并且指向 Person它自己:  Person.prototype.constructor = Person; 这个属性很容易在不经意间被我们修改, 出现这种情况时我们需要手动修正一下, JQ也是这样处理的, 详情请看最后面的补充, 现在继续上面的讨论;

4.从上图中我们还可以看到 _proto_ :Object,   原型链 又将P1, P2 和 Object类联系了起来, 这个,P1,P2 就可以使用 Object.prototype 这个内存公共空间里的 所有公共方法和属性,虽然Person.prototype上没有这些方法和属性, 我们 alert( P1.hasOwnProperty('id') ) 是可以得到true的,因为 它们在同一条原型链上。

从上图还可以看出, 浏览器也给Objcet加了这样的个属性: Object.prototype.constructor = Object; 那为什么 P1.constructor 会是Person, 而不是Object呢,  因为原型链是 这样的   P1  _proto _  Person   _proto _  Object , P1在Person.prototype处找到了constructor这个属性,就不会继续往下找,只有找不到的时候才往下找。

5.原型链的尽头是Object,   从上头可以看出,没有  _proto_ 再连接到别的地方了。

6.所以,只要是在同一原型链上,实例化对象就可以使用这些方法和属性,如果有重复的方法或属性, 距离近的会覆盖距离远的。

下面我做了个小图给大家参考参考 :

-如果图片看不清,请单击鼠标右键,复制图片地址,粘贴在浏览器地址栏上打开------------------------------------------------------------------------------------------------------------------------------------------------------

a.上面可看出,  房子嘛,  不是说你一出生就有的,  自己 没有可以先住老爸的, 如果老爸没有嘛,  老爸他哥有,  你出门在外,  也可以先去住着先的,   再没有嘛再去别的亲戚家住下先,     最远的尽头是 Object,

b.如果你老爸买房子了,   那你就别去你大伯家住啦,   你就去你老爸那住,

c.如果你有能力啦,买房子啦, 就自己搬出来住啦!(相当于加 this.sleep ,优先级高于 prototype上的sleep,和css中的 id相似)

补充:

上面说到的我们会在不经意间会修改,Person.prototype.constructor这个属性,是哪种情况呢?

 <script>
function Person()
{
this.name = '张三';
this.id = function (){ alert('身份证') };
}
//Person.prototype.say = function (){ alert('说话'); }
Person.prototype = { say: function (){ alert('说话') }} var P1 = new Person();
console.log(P1.constructor)
</script>

Person.prototype也是对象,所以可以改成下面的写法,但是改成这样的写法后,我们会看到,P1.constructor 竟然变成了 function Object() { [native code] },  怎么会变成  Object 呢?

是这样的,第一种写法, 是给 Person.prototype 对像添加属性;  而第二种写法, 是直接把一个对象{ }覆盖了 Person.prototype 这个对像,   这种写法的{ }对象是 Object 实例出来的,  所以嘛,  这个 P1.constructor当然就是Object啦;

像上面的,你老爸把房产证卖给都给Objcet了,虽然你还住着(别人还没赶你走~~), 你说这个房子的主人是谁?

所以我们需要手动修正一下,Person.prototype.constructor = Person;

下图可以看到,JQ也是这样处理的:

轻松搞定javascript原型链 _proto_的更多相关文章

  1. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器     1.声明        var   2.作用域       全局变量. 局部变量. 闭包(相对的全局变量):   3.类型         a.基本类型(undefi ...

  2. 一张图带你搞懂Javascript原型链关系

    在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...

  3. 一张图搞懂javascript原型链

    js高级里面原型链对于新手来说并不友好,总的来说就是 任何函数都有自己的原型对象(prototype),任何实例对象都__proto__指向构造函数的原型 先来个最简单的原型三角关系 var fn = ...

  4. 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

    hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...

  5. 轻松搞定javascript日期格式化问题

    Date.prototype.format = function(f){ var d = this f = f || "yyyy-MM-dd hh:mm:ss" return f. ...

  6. 人脸识别JavaScript也可以轻松搞定

    前言 是不是觉得不可思议,js已经强大到这个地步? 是的,js日新月异,它在不断的进步.只要稍不留神,那我们都只能望尘莫及了. 今天我们就来看看是什么js插件可以如此厉害? 人脸识别JavaScrip ...

  7. 【转】轻松搞定FTP之FlashFxp全攻略

    转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...

  8. Webcast / 技术小视频制作方法——自己动手录制video轻松搞定

    Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的 ...

  9. JavaScript学习总结(十七)——Javascript原型链的原理

    一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...

随机推荐

  1. Spring 之 注解详解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  2. Java并发编程之闭锁简介

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过.它可以使一个或多个线程等待一组事件发生.闭锁状态包括一个计数器 ...

  3. MySql数据库学习--存储过程(1)

    在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了 ...

  4. Java集合框架:Set、List、Map等介绍

    目录 1.Java集合类基本概念 2.Java集合类架构层次关系 1.Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上来讲,数组是我们一个很好的选择,前提是我们事先已经明确知道 ...

  5. Android studio GPU Monitor :GPU Profiling needs to be enabled in the device's developer options

    Android studio GPU Monitor 在真机上不能使用,提示:GPU Profiling needs to be enabled in the device's developer o ...

  6. 移动网页版Meta 标签

    viewport 大部分移动浏览器都接受,比如 Opera Mobile, iPhone, Android, Iris, IE, BlackBerry, Obigo, Firefox 最基本的例子,在 ...

  7. 组合数(DFS)

    组合数 点我   描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合.   输入 输入n.r. 输出 按特定顺序输出所有组合.特定顺序 ...

  8. 【C语言】单片机上的按键检测框架

    又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了. 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收.滤波. ...

  9. ZigBee 协议规范

      ZigBee协议栈体系结构由应用层.应用汇聚层. 网络层.数据链路层和物理层组成,如下图所示:   图1 ZigBee 协议栈体系的层次结构      应用层定义了各种类型的应用业务,是协议栈的最 ...

  10. Matlab与.NET混编解决人脸识别问题

    原文 http://www.cnblogs.com/asxinyu/archive/2013/05/29/3107013.html 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的 ...