先来作个复习,ES5中有有几种数据类型呢?数据结构
除了基本数据类型,万物皆对象,记住这个很重要,这体现了js设计的哲学思想,和现实生活事物存在的关系如出一辙。prototype
接触js也一年有余了,刚开始看各类概念感受在记忆,先能上手干活的感受也让本身先用了js起来,回头来看不少概念你不真正用的有些感悟可能真的很迷糊,就像今天忽然问本身__proto__ 是干吗的,和它长得很像的prototype又是干吗的,为啥不都用一个,看起来读起来都那么像。。。。ok,我尽可能把本身所思所想记录下来,能表达的清晰,哈哈其实我理解能力有限哈哈哈。设计
不让本身思惟绕弯子,当咱们想彻底弄清楚一件事情的时候,那么最好搞清楚咱们最关心的两个问题:它是什么,有什么用,那么先直接给几个定论(若是有误区请各位大神指正):3d
是什么code
__proto__
每一个对象都拥有的属性对象
prototype
每一个方法都拥有的属性blog
有什么用原型链
好了,先来讲是什么,那么让咱们想一想几个关键字:每一个对象,每一个方法,那么记得开始很重要的一件事儿么,就是js中万物皆对象,那么方法是什么鬼,没错,方法也是对象,一种须要特殊拎出来的对象,特殊在哪呢,那么牛逼。。。。其实就是要理解是什么中,方法比对象更牛逼一些,由于它既是对象又是方法。。。。因此呢?说明方法既有__proto__属性又有prototype属性。那么咱们能够开始看例子来加深理解:原型
var A = function(){}; // A是一个方法,固然也是个对象 var a = new A(); // a是一个由A创造出的对象,不是方法 //看一看对象非方法的行为 console.log(a.__proto__); //object console.log(a.prototype); //undefined, 对象没有 //看一看方法的行为,方法也是对象哦 console.log(A.__proto__); //function console.log(A.prototype); //object
是否是有点晕了,哈哈我也是,别急至少咱们验证了咱们是什么的定论,接下来研究下有什么用,其实在这以前难道很差奇a.__proto__,a.prototype, A.__proto__,A.prototype, 都等于谁吗?那咱们来接着验证。io
console.log(a.__proto__ === A.prototype); //true console.log(a.prototype === undefined); //true console.log(A.__proto__ === Function.prototype); //true console.log(A.prototype === a.__proto__); //true
矣,是否是看出来点神马?没错,有一点点原型链的感受了,那么继续
//先看a这条链 console.log(a.__proto__.__proto__ === A.prototype.__proto__); //true console.log(a.__proto__.__proto__ === Object.prototype);//true console.log(a.__proto__.__proto__.__proto__ === Object.prototype.__proto__);//true console.log(a.__proto__.__proto__.__proto__ === null);//true //再看看A这条条链 console.log(A.__proto__.__proto__ === Function.prototype.__proto__);//true console.log(A.__proto__.__proto__ === Object.prototype);//true console.log(A.__proto__.__proto__.__proto__ === Object.prototype.__proto__);//true console.log(A.__proto__.__proto__.__proto__ === null);//true
矣,像不像两个链条了?并且这两个链条还有些关系呢,头大?我也是。。要不来张图吧
说明一下,这里有两类事物:对象和对象方法,对象方法是我起的名字。。。哈哈,记住方法也是对象,js万物皆对象哦。其中红色框是表示的原型对象,网上不少图把它和拥有它的对象画在一块儿,我以为不够直观,因此就本身画出来啦,对照上面总结的是什么和原型链的验证,再配合这张图,个中体会,哈哈有木有豁然开朗的赶脚,若是没有没关系,多看几遍喽哈哈哈
而后咱们来看下,这张图几个有意思的地方。