js.jpg
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
。