JavaScript設計模式-第一部分:單例模式、組合模式和外觀模式javascript
設計模式是一些可靠的編程方式,有助於保證代碼更加易於維護、擴展及分離,全部設計模式在建立大型JavaScript應用程序時均不可或缺html
單例模式是指在您要確保始終只建立一個對象實例時使用的設計模式。在面向對象的經典編程語言中,建立單例模式背後的概念多少有點讓人難以理解,由於其中包含一個同時具備靜態及非靜態屬性和方法的類。但本文主要討論JavaScript,所以,因爲JavaScript是一種不包含真正類的動態語言,所以JavaScript版本的單例模式極其簡單。前端
爲何須要採用單例模式?
在我開始介紹實施細節以前,我須要探討一下爲何單例模式對於應用程序很是有用。它可以確保您只有一個對象實例可以實際派上用場。在服務器端語言中,您可能會使用單例處理數據庫鏈接,這是因爲爲一個請求建立多個數據庫鏈接純粹是一種資源浪費。一樣,在前端JavaScript中,您可能會但願將負責處理全部AJAX請求的某個對象設置爲單例。規則很是簡單:若是每m次建立新實例時,實例的功能均徹底相同,那麼將其設置爲單例。html5
可是,這並非採用單例的惟一緣由。至少在JavaScript中,單例可以讓您保證命名空間對象和函數井井有理,防止它們與全局命名空間混淆,您可能明白,這是一種可怕的想法,特別是在使用第三方代碼的狀況下。使用命名空間單例模式也被稱爲模塊設計模式。java
展現單例模式
要建立單例,您只需建立一個對象文字。數據庫
var Singleton = { prop: 1, another_prop: 'value', method: function() {...}, another_method: function() {...} };
您還能夠建立具備私有屬性和方法的單例,但因爲設計使用封閉函數和自調用匿名函數,於是稍微有些難以理解。函數內部聲明瞭一些局部函數和/或變量。而後,建立並返回一個對象文字,其中包含一些引用您在更大的函數範圍內聲明的變量和函數方法。緊隨函數聲明放置()便可當即執行外部函數,並將所得的對象文字費賠給變量。若是這些介紹讓你感到困惑,那麼請看下面的代碼,隨後我將會做出進一步的說明。編程
var Singleton = (function() { var private_property = 0, private_method = function () { console.log('This is private'); } return { prop: 1, another_prop: 'value', method: function() {...}, another_method: function() {...} } }());
關鍵在於,當經過某個變量所在函數前方的var聲明該變量時,該變量只能在函數內部經過該函數內聲明的各函數(例如對象文字內函數)進行訪問。return語句可幫助咱們回到在外部函數自行執行後分配給單例的對象文字。設計模式