天天看點

《JavaScript應用程式設計》一一3.8 工廠函數

本節書摘來華章計算機出版社《javascript應用程式設計》一書中的第3章,第3.8節,作者:eric elliott 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

使用對象字面量帶來的便捷是顯而易見的,不過它們無法封裝私有資料。封裝的概念之是以在程式設計中具有價值,是因為它将程式内部的實作細節對使用者做了隐藏。回憶一下“四人幫”在面向對象設計模式一書中首章的描述,“面向接口程式設計,而不是面向實作程式設計”,封裝将這一編碼原則在代碼中貫徹,即對使用者隐藏實作細節。

不過,經過前面幾節的介紹,你已經對構造函數的弊病有所了解,并知曉如何去規避。下面介紹一種構造函數的替代方案:工廠函數。

工廠函數被用來建構并執行個體化對象,使用它的目的在于将對象建構的細節從對象使用的過程中抽象出來,在面向對象的程式設計中,工廠函數的使用範圍非常廣。

回到之前單例模式的例子,将單例對象通過方法調用封裝起來是非常實用的,你可以将單例對象存放在一個私有變量中,随後通過閉包來擷取它的引用。

使用相同的方法為car類添加停車與刹車功能:

與構造函數的效果一樣,你将私有資料封裝在了閉包中,現在唯有使用特權方法.toggleparkingbrake()才可以控制刹車杆狀态。

與構造函數不同的是,你無需在工廠函數前追加new關鍵字(或無需擔心忘記new關鍵字時,屬性與方法的指派會污染至全局對象)。

當然,在這裡你完全可以使用原型來提升代碼執行效率。

現在工廠函數本身的代碼已被精簡至一行,并使用對象字典options作為其參數清單,這樣一來你便可以配置那些你想要覆寫的屬性。

利用原型本身所具有的特性,你完全可以在程式運作期間,對原型進行任意的屬性替換操作,這裡,我們使用之前所定義的carprototype原型對象:

注意: 最好不要将對象或者數組類型的屬性放置在原型上托管,萬一它們在執行個體層面上使用,你麻煩就大了。針對這種引用類型的屬性,建議在工廠函數中為每個執行個體單獨建立一份拷貝。

繼續閱讀