《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記三:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法分析
本文實(shí)例講述了Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)單例模式原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
1.單例模式概述
源自百度百科對(duì)于單例模式的定義:
單例模式的意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類(lèi)稱(chēng)為單例類(lèi)。
在javascript的世界里,其實(shí)沒(méi)有嚴(yán)格的對(duì)象和類(lèi)定義,“一切皆對(duì)象”使得javascript中都是對(duì)象,不能像java,c++或者php使用特定的方法返回一個(gè)實(shí)例來(lái)實(shí)現(xiàn),因此對(duì)javascript來(lái)說(shuō),我們要?jiǎng)?chuàng)造的是一個(gè)“不能被多次實(shí)例化的”對(duì)象,也就是說(shuō)只能實(shí)例化一次的對(duì)象。
2.簡(jiǎn)單單例模式:
只能實(shí)例化一次的對(duì)象也就可以使用“對(duì)象字面量”的定義方式來(lái)實(shí)現(xiàn):
var singleton = { attribute:'', method:function(){} }
這樣定義的對(duì)象,不能使用new singleton的方式來(lái)生成另外的對(duì)象(不存在prototype和constructor屬性)。
3.包含私有成員的單例模式:
如果看過(guò)之前的我寫(xiě)的關(guān)于類(lèi)成員的文章,自然的我們就能想到用閉包來(lái)實(shí)現(xiàn),既然要用的閉包,那么一定會(huì)用到函數(shù)和函數(shù)返回值,于是,這樣的單例模式如下:
var singleton = function(){ var private_attribute = ''; functioin private_method(){} return { public_attribute:'', public_method:function(){} }; }
還記得匿名函數(shù)嗎?通常在使用閉包的時(shí)候會(huì)使用,改進(jìn)之后如下:
var singleton = (function(){ var private_attribute = ''; functioin private_method(){} return { public_attribute:'', public_method:function(){} }; })();
4.惰性加載(lazy loading,延遲加載)單例模式
2,3中所示單例模式定義方式都是在定義時(shí)創(chuàng)建的單例,這樣很浪費(fèi)內(nèi)存,如何能在使用的時(shí)候才創(chuàng)建(lazy loading,更多的用于圖片的延遲加載)呢?所謂惰性加載,也就是先定義,然后在某個(gè)地方才創(chuàng)建對(duì)象,所以必須要使用函數(shù),我們知道在java或者php中單例模式通常使用一個(gè)靜態(tài)方法來(lái)創(chuàng)建,同理,我們?cè)俑倪M(jìn)一下閉包形式的定義式:
var singleton = (function(){ var unique; function getinstance(){ if(!unique){ unique = construct(); return unique; } } function construct(){ var private_member; function private_method(){} return {//這里才是真正的單例對(duì)象 public_member:'', public_method:function(){} }; })();
這樣調(diào)用一個(gè)單例對(duì)象的方法:
singleton.getinstance().publicmethod();
這樣只有在調(diào)用方法或引用屬性的時(shí)候才會(huì)真正的創(chuàng)建unique對(duì)象,就是使用的時(shí)候比較麻煩:)
5.簡(jiǎn)單mvc代碼風(fēng)格
順便在這里分享一下我寫(xiě)js的一個(gè)簡(jiǎn)單風(fēng)格,盡管js是一個(gè)前臺(tái)代碼,但是就其本身而言,也可以將它的內(nèi)容分為mvc(model,controller,view,關(guān)于mvc的概念請(qǐng)baidu/google),因此在寫(xiě)一個(gè)頁(yè)面的js代碼的時(shí)候,我會(huì)這么寫(xiě):
//函數(shù)封裝在此 var controller = { init:function(){} }; //頁(yè)面相關(guān)內(nèi)容封裝在此 var view = { table:{}, banner:{}, foot:{} }; //數(shù)據(jù)相關(guān)內(nèi)容封裝在此 var model = { table_data:{} }
在頁(yè)面onload的時(shí)候調(diào)用controoler.init();完成初始化工作(數(shù)據(jù)加載,頁(yè)面渲染,事件監(jiān)聽(tīng)等),這樣寫(xiě)的目的是盡量將一些相同的邏輯組織在一起,方便查找和修改,目前只是一個(gè)雛形,希望在看完《javascript設(shè)計(jì)模式》這本書(shū)之后能寫(xiě)一個(gè)輕量級(jí)的模型出來(lái)^_^
感興趣的朋友可以使用在線(xiàn)HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】
- JS 設(shè)計(jì)模式之:?jiǎn)卫J蕉x與實(shí)現(xiàn)方法淺析
- javascript設(shè)計(jì)模式 – 單例模式原理與應(yīng)用實(shí)例分析
- js設(shè)計(jì)模式之單例模式原理與用法詳解
- JavaScript設(shè)計(jì)模式之單例模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之單例模式簡(jiǎn)單實(shí)例教程
- JS基于設(shè)計(jì)模式中的單例模式(Singleton)實(shí)現(xiàn)封裝對(duì)數(shù)據(jù)增刪改查功能
- JS設(shè)計(jì)模式之單例模式(一)
- NodeJS設(shè)計(jì)模式總結(jié)【單例模式,適配器模式,裝飾模式,觀(guān)察者模式】
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之單例模式
- JavaScript設(shè)計(jì)模式之單例模式實(shí)例
- JavaScript中的設(shè)計(jì)模式 單例模式
相關(guān)文章
Chrome調(diào)試折騰記之JS斷點(diǎn)調(diào)試技巧
這篇文章主要介紹了Chrome調(diào)試折騰記之JS斷點(diǎn)調(diào)試技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09關(guān)于JS判斷圖片是否加載完成且獲取圖片寬度的方法
本篇文章小編為大家介紹,關(guān)于JS判斷圖片是否加載完成且獲取圖片寬度的方法,有需要的朋友可以參考一下2013-04-04Google (Local) Search API的簡(jiǎn)單使用介紹
這篇文章主要介紹了Google (Local) Search API的簡(jiǎn)單使用。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11基于Javascript實(shí)現(xiàn)彈出頁(yè)面效果
彈出層效果是一個(gè)很實(shí)用的功能,很多網(wǎng)站都采用了這種方式實(shí)現(xiàn)登錄和注冊(cè),下面小編通過(guò)本文給大家分享具體實(shí)現(xiàn)代碼,對(duì)js彈出頁(yè)面效果相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a
這篇文章主要介紹了純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a,b本文分七大步驟給大家介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09