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