本回內(nèi)容介紹
上一回聊到JS中模擬接口,裝飾者模式,摻元類,分析了backbone的繼承源碼,感覺(jué)還好吧!
介一回,偶們來(lái)聊一下在JS單例模式(singleton),單例模式其實(shí)運(yùn)用很廣泛,比如:jquery,AngularJS,underscore吖蝦米的都是單例模式,來(lái)吧,直接開(kāi)始咯:
1. 單例模式保證一個(gè)類只有一個(gè)實(shí)例,從全局命名空間里提供一個(gè)唯一的訪問(wèn)點(diǎn)來(lái)訪問(wèn)該對(duì)象。其實(shí)之前寫過(guò)的對(duì)象字面量也是一種簡(jiǎn)單單例,如下:
var Singleton = { name: "飛狐", method: function () { return "hello world"; } }; alert(Singleton.method()); // 返回hello world
這就是一個(gè)簡(jiǎn)單單例了,應(yīng)該很多盆友已經(jīng)看出來(lái)了,沒(méi)有作用域,如果要擴(kuò)展私有屬性和方法的話,那么就可以靠閉包來(lái)實(shí)現(xiàn)。
2. 閉包單例模式顧名思義要用到閉包,作為返回實(shí)例對(duì)象,如下:
var Singleton = (function(){ var name = "飛狐"; // 私有屬性 var nickname = "帥狐"; var showNickname = function(){ // 私有方法 return nickname; } return { // 返回一個(gè)對(duì)象 name:name, // 將私有屬性公開(kāi) nickName: function(){ // 在公開(kāi)的方法中返回私有方法 return showNickname(); } } })(); alert(Singleton.name); // 飛狐 alert(Singleton.nickName()); // 帥狐
這里我們接著上邊兒簡(jiǎn)單單例的例子來(lái),稍微的改一下,改成閉包之后,就數(shù)據(jù)保證了不受外界干擾了。
3. 惰性單例模式惰性單例就是只有在使用的時(shí)候才初始化,如下:
var Singleton = (function(){ var uniq; // 私有變量,用來(lái)存放返回實(shí)例化對(duì)象的容器 function init(){ // 初始化方法 var buildeList = function(){ // 私有方法 // 下面這一堆就是創(chuàng)建一個(gè)有序列表,含有5個(gè)li var root = document.createElement("ol"); document.body.appendChild(root); for(var i=0;i<5;i++){ var a = document.createElement("a"); a.innerHTML = "帥狐"; var li = document.createElement("li"); li.appendChild(a); root.appendChild(li); } } return { // 一樣的閉包,暴露共有方法 method:function(){ return buildeList(); } }; } return { // 這里就是實(shí)例化對(duì)象了 getInstance:function(){ // 這里的uniq為true的時(shí)候,或者可以寫成 typeof uniq==="undefined" if(!uniq){ // 創(chuàng)建單例實(shí)例 uniq = init(); } return uniq; } }; })(); Singleton.getInstance().method(); // 返回1.帥狐2.帥狐3.帥狐4.帥狐5.帥狐
這個(gè)例子就是惰性單例了,也就是說(shuō)只有在用的時(shí)候才會(huì)去初始化方法,這樣可以更省資源。
4. 分支單例模式分支單例就很簡(jiǎn)單了,就是做程序分支的判斷,利用分支來(lái)返回相應(yīng)的實(shí)例,經(jīng)常用于瀏覽器檢測(cè),直接看代碼吧,如下:
var ua = window.navigator.userAgent.toLocaleLowerCase(); var matchedRE = /iphone|android|symbianos|windowssphone/g; var Singleton = (function() { var webUrl = "web端url"; var mobileUrl = "移動(dòng)端url"; return (matchedRE.test(ua))?mobileUrl:webUrl; })(); // 如果是pc端返回就是web端url,如果是移動(dòng)端就返回移動(dòng)端url alert(Singleton);
這個(gè)例子就是分支單例了,比較簡(jiǎn)單,這個(gè)例子也是模擬京東目前判斷訪問(wèn)設(shè)備的代碼。
裝個(gè)逼再說(shuō)。剛看到一新聞,韓雪發(fā)微博稱,因?yàn)樽约盒薷牡谋驹绿撞停显铝髁烤颓辶懔耍⒎Q:“我改這個(gè)月的和上個(gè)月有什么關(guān)系嗎?我付了錢的,多余的流量憑什么你說(shuō)清零就清零呢?這不是霸王條款嗎?”,女神都忍受不了了,哈哈~~
5. 筆試題:判斷字符串中出現(xiàn)次數(shù)最多的字母,返回該字母及其出現(xiàn)次數(shù)這一回講的內(nèi)容不多,就一個(gè)單例模式,
下面的內(nèi)容更簡(jiǎn)單,一道題。
function calculate(str){ //命名一個(gè)變量放置字母出現(xiàn)的最高次數(shù)并初始化為0 var maxLength = 0; //命名一個(gè)變量放置結(jié)果輸入 var result = ""; //循環(huán)迭代開(kāi)始,并判斷字符串是否為空 while(str != "" ){ //將原始的字符串變量賦值給新變量 var oldStr = str; //用字符串的substr的方法得到第一個(gè)字符(首字母) var getStr = str.substr(0,1); //執(zhí)行一次全局替換 eval("str = str.replace(/"+getStr+"/g,"")"); //判斷原始的字符串的長(zhǎng)度減去替代后字符串長(zhǎng)度是否大于之前出現(xiàn)的最大的字符串長(zhǎng)度 if(oldStr.length-str.length > maxLength ) { //兩字符串長(zhǎng)度相減得到最大的字符串長(zhǎng)度 maxLength = oldStr.length-str.length; //返回最大的字符串結(jié)果(字母、出現(xiàn)次數(shù)) result = "出現(xiàn)最多的字母是:" + getStr + "------出現(xiàn)了" + maxLength + " 次。"; } } return result; } var str ="adadfdfseffserfefsefseeffffftsdg"; alert(calculate(str));
這個(gè)題基本上我都寫了注釋,難度適中,當(dāng)娛樂(lè)消遣。
這一回,主要聊了單例模式,應(yīng)該很好理解,難度不大。
下一回,咱主要聊一聊工廠模式。
話說(shuō),看完文章覺(jué)得ok,客觀點(diǎn)個(gè)贊唄,好東西多推薦推薦,讓大家都知道,嘿嘿,好像有點(diǎn)那啥賣瓜了...
注:此系飛狐原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86126.html
摘要:本回內(nèi)容介紹上一回聊到數(shù)據(jù)類型,簡(jiǎn)單的過(guò)了一遍,包括個(gè)數(shù)組新特性等,這一回來(lái)聊聊對(duì)象,結(jié)合數(shù)組來(lái)實(shí)戰(zhàn)一些例子,在做題中成長(zhǎng),記憶會(huì)更深刻,來(lái)吧,開(kāi)始咯創(chuàng)建實(shí)例的方式有兩種使用操作符后跟構(gòu)造函數(shù)飛狐使用對(duì)象字面量表示法飛狐也可以飛狐這種寫法與 本回內(nèi)容介紹 上一回聊到JS數(shù)據(jù)類型,簡(jiǎn)單的過(guò)了一遍,包括9個(gè)數(shù)組新特性等,這一回來(lái)聊聊Object對(duì)象,結(jié)合數(shù)組來(lái)實(shí)戰(zhàn)一些例子,在做題中成長(zhǎng),記...
摘要:橋接模式之特權(quán)函數(shù)特權(quán)函數(shù),用一些具有特權(quán)的方法作為橋梁以便訪問(wèn)私有空間,可以回憶一下之前的系列。連續(xù)自然數(shù)分組,計(jì)算最多組的個(gè)數(shù)將至這個(gè)連續(xù)自然數(shù)分成組使每組相加的值相等。個(gè)數(shù)組中數(shù)字最多的一組有個(gè)此時(shí)的和為。 本回內(nèi)容介紹 上一回,聊了適配器模式,圖片預(yù)加載,介一回,聊橋接模式(Bridge),跟之前一樣,難度比較小,橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,通過(guò)橋接模式聯(lián)系彼此,同時(shí)...
摘要:本回內(nèi)容介紹上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式,用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處理類與的不匹配。這一回,主要聊了適配器模式,圖片預(yù)加載,主要還是理解下一回,聊一聊橋接模式,順便做一做計(jì)算題。 本回內(nèi)容介紹 上一回,聊了代理模式,虛擬代理,圖片懶加載,介一回,也比較容易,適配器模式(Adapter),用一個(gè)新的接口對(duì)現(xiàn)有類的接口進(jìn)行包裝,處...
摘要:本回內(nèi)容介紹上一回,聊了聊狀態(tài)模式,并介紹了一下介一回,聊鏈?zhǔn)骄幊蹋M一下,再模擬一下封裝一個(gè)庫(kù)。這一回,主要聊了鏈?zhǔn)秸{(diào)用,模擬了,尤其是,希望大家能喜歡這次代碼分享。下一回,聊一聊的策略模式。 本回內(nèi)容介紹 上一回,聊了聊狀態(tài)模式(State),并介紹了一下vue.js;介一回,聊鏈?zhǔn)骄幊蹋M一下jQuery,再模擬一下underscore.js,封裝一個(gè)庫(kù)。 1. 鏈?zhǔn)秸{(diào)用 (...
摘要:說(shuō)白了,就是對(duì)訪問(wèn)進(jìn)行控制。這一回,主要聊了代理模式,虛擬代理,圖片懶加載,難度適中下一回,聊一下適配器模式,難度也比較小。 本回內(nèi)容介紹 上一回,聊了門面模式,DOM2級(jí)事件,事件委托,介一回,也比較容易,代理模式(proxy),代理對(duì)象控制對(duì)本體對(duì)象的訪問(wèn),實(shí)現(xiàn)了同樣的接口,并且會(huì)把任何方法的調(diào)用傳遞到本體對(duì)象。說(shuō)白了,就是對(duì)訪問(wèn)進(jìn)行控制。直接上代碼,走你: 1.代理模式 代理也是...
閱讀 1481·2021-11-22 13:52
閱讀 1299·2021-09-29 09:34
閱讀 2704·2021-09-09 11:40
閱讀 3035·2019-08-30 15:54
閱讀 1262·2019-08-30 15:53
閱讀 976·2019-08-30 11:01
閱讀 1359·2019-08-29 17:22
閱讀 1953·2019-08-26 10:57