javascript的__proto__和prototype

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。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容