javascript
的所有一切的起源是null
。以null
为原型,产生了一切Object
,包括函数也是Object
。但是null本省不是Object,其它都是。任何一个Object都有一个
__proto__
指向自己构造函数的所对应的原型。当声明一个函数时,如
function Foo(){}
函数申明时,都会产生以自己命名的构造函数,并产生一个原型。每个函数都有自己的原型,如Foo.prototype
。javascript
内部定义的函数也都有自己的prototype
,默认只有函数对象拥有该属性。并且该属性的值指向它对应的prototype
。
Object->Object.prototype
Number->Number.prototype
Function->Function.prototype
因为函数本省也是对象,所以函数也有自己的__proto__
,他们都指向Function.propetype。因为他们是通过Function构造函数构造的。比如上述的Foo函数,就有
Foo.__proto__===Function.protype;
Foo.prototype===Foo.prototype;
var foo1=new Foo();
var foo2=new Foo();
foo1.__proto__===foo2.__proto__;
foo1.__proto__===Foo.prototype;
任何一个函数的prototype都是一个Object。所以它们本身也有__proto__
属性。
总结以上内容,对于__proto__
- 所有js对象都有
__proto__
-
__proto__
指向当前对象的构原型,也就是申明函数是产生的函数.prototype
。(函数对象本身也符合这个规则,它的申明函数原型是Function.prototype
) -
函数.prototype
本身也是对象,所以它的__proto__
也存在。所有非Object
函数函数.prototype
的__proto__
都是Object.prototype
。而Object.prototype
的__proto__
是null
。