转载至http://www.cnblogs.com/sinstone/p/5136871.html

 

一、联系

prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象,同样任意一个构造函数实例化的对象都有一个__proto__属性(__proto__并非标准属性,ECMA-262第5版将该属性或指针称为[[Prototype]],可通过Object.getPrototypeOf()标准方法访问该属性),指向构造函数的原型对象。如下代码所示:

function a() {
//console.log("I'am a function.");
}
//b是实例化对象,a是构造函数
var b = new a(); console.log(b.__proto__ == a.prototype); //true
console.log(Object.getPrototypeOf(b) == a.prototype); //true,标准方法返回的结果和上述一样

二、区别

基于上述的示例代码,我们继续稍微深入去看看prototype和__proto__的区别到底在哪里,如下:

//注意:a作为构造函数时的prototype属性与a作为普通函数时的__proto__属性并不相等
console.log(a.prototype == a.__proto__);//false //这个怎么理解呢,我们再看看如下代码
console.log(a.__proto__); //function (){}
console.log(a.__proto__ == Function.prototype);//true //实际上,a作为一个普通函数调用的时候,它的构造函数就是内置对象Function了,所以它指向的原型对象,自然对应就是Function.prototype.
//其实这个和console.log(b.__proto__ == a.prototype)是一样的道理 //我们继续看如下代码,当a作为构造函数时,它的原型,和它的原型的原型都指向神马
console.log(a.prototype); //a{}
console.log(a.prototype.__proto__); //Object{} //我们再看看a作为普通函数时,它原型的原型指向神马
console.log(a.__proto__.__proto__); //Object{} //即有以下结果
console.log(a.__proto__.__proto__ == a.prototype.__proto__); //true //结论:prototype属性可以给函数和对象添加可共享(继承)的方法、属性,而__proto__是查找某函数或对象的原型链方式
//因此,有人说原型链实际是通过__proto__属性链接起来的,也是有一定道理的

综上所述,要理解prototype和__proto__的联系区别,我认为主要需明确以下两点,对理解prototype和__proto__是比较有用的:

  1. JavaScript中的函数是对象,而且除了使用字面量定义外,都需要通过函数来创建对象;
  2. prototype是构造函数访问原型对象,__proto__是对象实例访问原型对象。

Prototype是一个对象的属性,它是由这个对象创建的子对象的原型
__proto__是一个对象的内部属性,指向它的原型,也可以通过Object.getPrototypeOf()来获取对象的原型,但是用__proto__更快。

有点拗口,意思就是__proto__属性指向的才是自己的原型,而prototype是父对象的属性,子对象是继承父对象的prototype属性指向的对象的属性和方法。那么实际上,整个继承的过程就是,当我访问一个对象的属性时,首先会查找这个对象有没有属性,如果有的话,直接取出,如果没有的话,通过这个对象的__proto__属性指向的对象查找此对象(即第一个对象的父对象)的属性,有的话返回,没有的话,继续往上查找,直到返回属性值或者空(这是JS对象的属性查找的内部实现)。

也就是说, 子对象.__proto__===父对象.prototype  但是只有在chrome和Firefox 中存在  在IE中没有

最新文章

  1. 给jquery-validation插件添加控件的验证回调方法
  2. python文件读写操作
  3. [转][MSSQL]SQL Server 2008 记住密码功能
  4. iOS:缓存与Operation优先级问题
  5. jquery css 简单笔记
  6. Unite Beijing 2015大型活动
  7. 对使命召唤OL游戏中队友能相互救治的动作设定的感慨
  8. css3 animation 动画属性简介
  9. IdentityServer4 SigningCredential(RSA 证书加密)
  10. C语言数组求长度
  11. docker保存、载入、导出、导入
  12. Java SubString截取字符串
  13. js 原生 ajax
  14. golang---map类型
  15. UVa 1103 Ancient Messages(二重深搜)
  16. 通过HttpWebRequest调用webService
  17. webVR全景图多种方案实现(pannellum,aframe,Krpano,three,jquery-vrview)
  18. codeforces 578b//"Or" Game// Codeforces Round #320 (Div. 1)
  19. kindeditor<=4.1.5上传漏洞复现
  20. linux expect 的使用

热门文章

  1. 《从零开始学Swift》学习笔记(Day 34)——静态属性是怎么回事?
  2. hive表信息查询:查看表结构、表操作等
  3. Starting Session of user root.
  4. Python迭代器包itertools(转)
  5. Python 网络编程——socket
  6. argparse 模块 在终端执行脚本文件
  7. git钩子
  8. solr-6.4.2安装+分词器配置
  9. 剑指offer 面试17题
  10. Google Cloud Platfrom中使用Linux VM