这篇博客来源于,有天mentor忽然传给我了这张祖传的图片,而且发誓必定要给我讲清楚,然鹅在他的一番激情讲解以后,他本身也被绕懵了...
因而后来我决定整理一下彷佛还有点清晰的思路,记录一下我对这张图的理解。做为一个小白,对于js中这些比较复杂的概念的理解仍是颇有可能出现误差的,若是哪里出现了各类错误TUT请各位大神不吝赐教!
感受本身写的是真的很绕...啊..惆怅...html
这张图乍看起来有些复杂,咱们先看图中的一小部分:这部分出现了三种关系指向prototype
,_proto_
,constructor
。java
要搞清这三种关系指向之间的关系(拗口...),其实也就是要搞懂,构造函数
、由构造函数new操做创造出的实例对象
、和构造函数的原型对象
之间的关系。函数
函数
(关系中的构造函数Foo)的属性对象
的属性对象
(关系中的实例对象f1,f2)的属性对象
(关系中的原型对象Foo.prototype)的属性就拿图里面例子来讲:spa
f2,f1
是由构造函数Foo()
构造出的实例对象。Foo
是一个构造函数,他的prototype属性则是一个指针,指针指向了Foo的原型对象,Foo.prototype
,之因此要费这么大劲指向一个原型对象呢?就是为了共享原型对象里所包含的属性和方法呀~经过Foo
构造出的f1,f2
就同时拥有了原型对象里的属性和方法。Foo.prototype
在Foo
的prototype
属性指向它之时,它所包含的constructor
属性也指向回了它的构造函数Foo
.图里还包含了其余这样的"三角关系":prototype
这张图描述的是Object(js中最基本的对象)和它的实例、构造函数之间的关系。o1,o2
是Object的实例对象,Object()
是Object对象的构造函数。
此时~注意红框框标注出的部分,因为Object是js中最基本的对象(兜底对象...),因此Object
的_proto_
指向的是null
指针
咦?这组关系就有点奇怪了,咱们中出现了一个叛徒!Foo()
这个构造函数为何也有_proto_
属性?code
_proto_
属性,而且这个_proto_
属性指向了是函数的原型对象Function.prototype
,而它的构造函数则是大Function()
。即小function
实际上是由大Function()
new操做出的实例!Function.prototype
.(至关的绕...)最后再总体看一遍这张图,这些对象之间的原型指向最终连成了一条原型链,指向基础对象Objecthtm
f1,f2
是对象,它的_proto_
属性指向了Foo.prototype
。而Foo.prototype
也是对象,它的_proto_
属性指向了兜底中的Object.prototype
,造成了一条原型链。function Foo()
是函数也是对象,它的_proto_
属性指向着函数共同的原型Function.prototype
。Function.prototype
是对象,它也有_proto
属性,而这个属性最终也会指向咱们的兜底Object.prototype
,这又是另外一条原型链。