Prototype Review
经典的原型链与它的内部思想
可以见到上图中,分为三栏,分别是objects, functions 和 function prototypes。
也就是说,任何的Javascript函数,都拥有它的原型(prototype)。这个原型,是隐藏在实现内部的,也就是__proto__的具体含义。
首先,我们写出一个函数Foo()。Foo便在作用域中创建了一个Foo的指针,这个指针指向函数Foo。
除此,Foo还创建了一个原型对象,叫做Foo.prototype。这个是所有使用Foo创建出来的对象所共享的原型对象。这个对象,拥有一个叫做constructor的指针,它指向了Foo函数。这个指针用来干什么?就是在我们使用Foo创建对象以后,可以用Foo.prototype.constructor来找到这个函数对象。
于是,我们使用Foo创建一个对象实例,叫做fooObj。fooObj拥有一个内部指针,虽然它已经可以被任何人访问了,也就是__proto__。我们可以发现,fooObj其实是一个干净的对象,它没有constructor。但是由于它有__proto__,那么由于JavaScript的向上查询,它会查询到Foo.__proto__的constructor,也就是Foo.prototype。这里,Foo.prototype有constructor,所以,便返回了Foo函数。
使用function name() {}创建的函数中,都有自己的__proto__,也就是Object.prototype。然后,Object.proto,是null。**这里需要注意,所有的函数,他的__proto__都是Function.prototype。**那么一共有三个指向Function.prototype的指针,分别是Foo.proto,Function.__proto__以及Object.proto。可以理解,所有的Object都是由Function创建的,包括Object函数。所有的原型对象,除了Object自己,__proto__都是Object.prototype。