標籤:
下面我們先看一個例子已經一張圖。
function Foo() {}Object.prototype.name = ‘My Object‘;Foo.prototype.name = ‘Bar‘;var obj = new Object();var foo = new Foo();console.log(obj.name); // 輸出 My Objectconsole.log(foo.name); // 輸出 Barconsole.log(foo.__proto__.name); // 輸出 Barconsole.log(foo.__proto__.__proto__.name); // 輸出 My Objectconsole.log(foo. __proto__.constructor.prototype.name); // 輸出 Bar
通過對上面原型例子的閱讀與思考,我們可以得出以下結論:
1.通過new關鍵字建立的對象沒有prototype屬性,只有_proto_屬性。
2.通過new出來的對象其_proto_屬性指向被new對象.prototype
3.建構函式有_proto_與prototype屬性。
4.建構函式的prototype屬性指向建構函式.prototype 反過來建構函式.prototype.constructor指向該建構函式。(看圖)
5.只要是建構函式,建構函式._proto_都指向Function.prototype
6.Function與Object他們都是建構函式。
7.Object.prototype是所有對象的祖先,Function.prototype 是所有函數的原
型,包括建構函式。
以上每個結論都是自己參考文章並概括的,也可能會存在理解上的偏差,總之本人自己感覺這樣可以讓自己能夠大致理解原型大致是一個什麼概念以及對象間的原型關係。
補充1:
?建構函式內定義的屬性繼承方式與原型不同,子物件需要顯式調用父物件才能繼承構
造函數內定義的屬性。
? 建構函式內定義的任何屬性,包括函數在內都會被重複建立,同一個建構函式產生的
兩個對象不共用執行個體。
? 建構函式內定義的函數有運行時閉包的開銷,因為建構函式內的局部變數對其中定義
的函數來說也是可見的。
補充2:
? 除非必須用建構函式閉包,否則盡量用原型定義成員函數,因為這樣可以減少開銷。
? 盡量在建構函式內定義一般成員,尤其是對象或數組,因為用原型定義的成員是多個
執行個體共用的。
註:參考文章
node.js開發指南
閱讀javaScript 的原型筆記