《javascript設計模式》學習筆記三:Javascript面向物件程式設計單例模式原理與實現方法分析
本文例項講述了Javascript面向物件程式設計單例模式原理與實現方法。分享給大家供大家參考,具體如下:
1.單例模式概述
源自百度百科對於單例模式的定義:
單例模式的意思就是隻有一個例項。單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。
在javascript的世界裡,其實沒有嚴格的物件和類定義,“一切皆物件”使得javascript中都是物件,不能像java,c++或者php使用特定的方法返回一個例項來實現,因此對javascript來說,我們要創造的是一個“不能被多次例項化的”物件,也就是說只能例項化一次的物件。
2.簡單單例模式:
只能例項化一次的物件也就可以使用“物件字面量”的定義方式來實現:
var singleton = { attribute:'',method:function(){} }
這樣定義的物件,不能使用new singleton的方式來生成另外的物件(不存在prototype和constructor屬性)。
3.包含私有成員的單例模式:
如果看過之前的我寫的關於類成員的文章,自然的我們就能想到用閉包來實現,既然要用的閉包,那麼一定會用到函式和函式返回值,於是,這樣的單例模式如下:
var singleton = function(){ var private_attribute = ''; functioin private_method(){} return { public_attribute:'',public_method:function(){} }; }
還記得匿名函式嗎?通常在使用閉包的時候會使用,改進之後如下:
var singleton = (function(){ var private_attribute = ''; functioin private_method(){} return { public_attribute:'',public_method:function(){} }; })();
4.惰性載入(lazy loading,延遲載入)單例模式
2,3中所示單例模式定義方式都是在定義時建立的單例,這樣很浪費記憶體,如何能在使用的時候才建立(lazy loading,更多的用於圖片的延遲載入)呢?所謂惰性載入,也就是先定義,然後在某個地方才建立物件,所以必須要使用函式,我們知道在java或者php中單例模式通常使用一個靜態方法來建立,同理,我們再改進一下閉包形式的定義式:
var singleton = (function(){ var unique; function getinstance(){ if(!unique){ unique = construct(); return unique; } } function construct(){ var private_member; function private_method(){} return {//這裡才是真正的單例物件 public_member:'',public_method:function(){} }; })();
這樣呼叫一個單例物件的方法:
singleton.getinstance().publicmethod();
這樣只有在呼叫方法或引用屬性的時候才會真正的建立unique物件,就是使用的時候比較麻煩:)
5.簡單mvc程式碼風格
順便在這裡分享一下我寫js的一個簡單風格,儘管js是一個前臺程式碼,但是就其本身而言,也可以將它的內容分為mvc(model,controller,view,關於mvc的概念請baidu/google),因此在寫一個頁面的js程式碼的時候,我會這麼寫:
//函式封裝在此 var controller = { init:function(){} }; //頁面相關內容封裝在此 var view = { table:{},banner:{},foot:{} }; //資料相關內容封裝在此 var model = { table_data:{} }
在頁面onload的時候呼叫controoler.init();完成初始化工作(資料載入,頁面渲染,事件監聽等),這樣寫的目的是儘量將一些相同的邏輯組織在一起,方便查詢和修改,目前只是一個雛形,希望在看完《javascript設計模式》這本書之後能寫一個輕量級的模型出來^_^
感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。
更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程式設計有所幫助。