這個思惟導圖是我對Object,原型,原型鏈等知識的總結,主要參考高程一書第六章,寫完才發現這麼多,之後可能會進行精簡。內容可能會出現差錯,歡迎批評指正。下載==>Github
ECMAScript支持面向對象(OO)編程,但不使用類或者接口。對象能夠在代碼執行過程當中建立和加強,所以具備動態性而非嚴格定義的實體。在沒有類的狀況下,能夠採用下列模式建立對象。git
- 工廠模式,使用簡單的函數建立對象,爲對象添加屬性和方法,而後返回對象。這個模式後來被構造函數模式所取代。
- 構造函數模式,能夠建立自定義引用類型,能夠像建立內置對象實例同樣使用new操做符。不過,構造函數模式也有缺點,即它的每一個成員都沒法獲得複用,包括函數。因爲函數能夠不侷限於任何對象(即與對象具備鬆散耦合的特色),所以沒有理由不在多個對象間共享函數。
- 原型模式,使用構造函數的prototype屬性來指定那些應該共享的屬性和方法。組合使用構造函數模式和原型模式時,使用構造函數定義實例屬性,而使用原型定義共享的屬性和方法。
JavaScript主要經過原型鏈實現繼承。原型鏈的構建是經過將一個類型的實例賦值給另外一個構造函數的原型實現的。這樣,子類型就可以訪問超類型的全部屬性和方法,這一點與基於類的繼承很類似。原型鏈的問題是對象實例共享全部繼承的屬性和方法,所以不適宜單獨使用。解決這個問題的技術是借用構造函數,即在子類型構造函數的內部調用超類型構造函數。這樣就能夠作到每一個實例都具備本身的屬性,同時還能保證只使用構造函數模式來定義類型。使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而經過借用構造函數繼承實例屬性。此外,還存在下列可供選擇的繼承模式。github
- 原型式繼承,能夠在沒必要預先定義構造函數的狀況下實現繼承,其本質是執行對給定對象的淺複製。而複製獲得的副本還能夠獲得進一步改造。
- 寄生式繼承,與原型式繼承很是類似,也是基於某個對象或某些信息建立一個對象,而後加強對象,最後返回對象。爲了解決組合繼承模式因爲屢次調用超類型構造函數而致使的低效率問題,能夠將這個模式與組合繼承一塊兒使用。
- 寄生組合式繼承,集寄生式繼承和組合繼承的優勢與一身,是實現基於類型繼承的最有效方式。
![](http://static.javashuo.com/static/loading.gif)