最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript單例模式與策略模式實(shí)例詳解

 更新時(shí)間:2023年06月25日 09:16:32   作者:flying_huixia  
這篇文章主要介紹了javascript單例模式與策略模式,結(jié)合實(shí)例形式詳細(xì)分析了javascript單例模式與策略模式基本概念、功能、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下

一、單例模式

1、概念

保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)

2、單例模式的實(shí)現(xiàn) -- 以創(chuàng)建div節(jié)點(diǎn)為例

var createDiv = (function(){
    var instance;
    var createDiv = function(html){
        if(instance){
            return instance
        }
        this.html = html;
        this.init();
        return instance = this;
    };
    createDiv.prototype.init = function(){
         var div = document.createElement('div');
         div.innerHTML = this.html;
         document.body.appendChild(div)
    }    
    return createDiv;    
  })()
var a =new createDiv('one');
var b =new createDiv('two');
console.log(a===b);  //true

上述例子有缺點(diǎn):

(1)使用了匿名自執(zhí)行函數(shù),增加了函數(shù)復(fù)雜度

(2) createDiv函數(shù)做了兩件事情,一是創(chuàng)建對(duì)象,二是管理單例。違背了單一職責(zé)原則

改進(jìn)--》使用代理實(shí)現(xiàn)

    //代理模式--改進(jìn)
        //只負(fù)責(zé)創(chuàng)建div的一個(gè)類
        var createDiv = function (html) {
            this.html = html;
            this.init();
        };
        createDiv.prototype.init = function () {
            var div = document.createElement('div');
            div.innerHTML = this.html;
            document.body.appendChild(div)
        }
        //引入代理類
        var proxySingle = (function(){
            var instance;
            return function(html){
                if(!instance){
                    instance = new createDiv(html)
                }
                return instance  
            }
        })();
        var a = new proxySingle('one');
        var b = new proxySingle('two');
        console.log(a === b); //true

3、惰性單例(使用)

只在需要的時(shí)候才創(chuàng)建對(duì)象實(shí)例

聯(lián)系登陸功能的需求,登陸的彈框只會(huì)出現(xiàn)一次,在點(diǎn)擊點(diǎn)擊登陸按鈕的時(shí)候出現(xiàn)

兩種實(shí)現(xiàn)

(1)在頁(yè)面加載完成時(shí),創(chuàng)建好這個(gè)浮窗,浮窗一開始是隱藏狀態(tài),當(dāng)用戶點(diǎn)擊登錄的時(shí)候,它才開始顯示。缺點(diǎn):會(huì)白白浪費(fèi)一些DOM節(jié)點(diǎn)。

(2)當(dāng)用戶點(diǎn)擊登陸按鈕時(shí)才開始創(chuàng)建浮窗:代碼如下:

var createLoginer = function(){
    var login = document.createElement("div");
    login.innerHTML='登錄浮窗';
    login.style.display = 'none';
    document.body.appendChild(login);
    return login
}
//點(diǎn)擊登陸按鈕
btn.onclick = function(){
   var loginer = createLoginer();
   loginer.style.display = 'block';
}

現(xiàn)在惰性的目的達(dá)到了,但失去了單例的效果--》再次修改如下:

用一個(gè)變量判斷是否已經(jīng)創(chuàng)建過(guò)登錄浮窗

 //創(chuàng)建登陸浮窗
        var createLoginer = function () {
            var login = document.createElement("div");
            login.innerHTML = '登錄浮窗';
            login.style.display = 'none';
            document.body.appendChild(login);
            return login
        }
        var loginer;
        var getSingle = function (fn) {
            return function () {
                console.log(this)
                return loginer || (loginer = fn.apply(this))
            }
        }
        //createSingleLoginer接下來(lái)作為函數(shù)調(diào)用,所以getSingle得返回一個(gè)函數(shù),并且這個(gè)函數(shù)得返回登錄浮窗
        var createSingleLoginer = getSingle(createLoginer);
        //點(diǎn)擊登陸按鈕
        var btn = document.getElementById("btn");
        btn.onclick = function () {
            var loginer = createSingleLoginer();
            loginer.style.display = 'block';
        }

getSingle就是用來(lái)管理單例的 

惰性單例:只有在合適的時(shí)候才創(chuàng)建對(duì)象,并只創(chuàng)建唯一的一個(gè)。把創(chuàng)建對(duì)象和管理單例的職責(zé)分布在不同的方法中,組合起來(lái)才能發(fā)揮真正的單例模式的威力。

二、策略模式

1、概念:

定義一系列的算法,把他們一個(gè)個(gè)封裝起來(lái),并且使他們可以相互替換

2、實(shí)例

發(fā)年終獎(jiǎng),按照等級(jí)和各自的基礎(chǔ)工資進(jìn)行乘積運(yùn)算

  var strage = {
            S:function(salary){
                return salary*4
            },
            A:function(salary){
                return salary*3
            },
            B:function(salary){
                return salary*2
            }
        }
        var calculateBounus = function(level,salary){
            return strage[level](salary)
        };
        console.log(calculateBounus('S',2000)) //8000
        console.log(calculateBounus('A',2000))  //6000

3、策略模式用來(lái)封裝算法,更廣義的使用,表單驗(yàn)證登錄算法

把校驗(yàn)方式封裝成策略對(duì)象

 var validatorFunc = function () {
            var validator = new Validator();
            validator.add(loginForm.userName, "isEmpty", '用戶名不能為空')
            validator.add(loginForm.passWord, "minLength:6", '密碼長(zhǎng)度不能少于6位')
            validator.add(loginForm.phone, "phoneValidator", '手機(jī)號(hào)碼格式錯(cuò)誤')
            var errMsg = validator.start();
            return errMsg
        }
        var loginForm = document.getElementById("login")
        function login() {
            var errMsg = validatorFunc();
            if (errMsg) {
                alert(errMsg);
                return false; //阻止表單提交
            }
        }
        var Validator = function () {
            //緩存校驗(yàn)規(guī)則
            this.cache = [];
        }
        Validator.prototype.add = function (dom, rule, err) {
            var ary = rule.split(':');
            this.cache.push(function () {
                var strategy = ary.shift();
                ary.unshift(dom.value);
                ary.push(err)
                return loginStrage[strategy].apply(dom, ary)
            })
        }
        Validator.prototype.start = function () {
            for (var i = 0; i < this.cache.length; i++) {
                var err = this.cache[i]()
                if (err) {
                    alert(err)
                }
            }
        }

運(yùn)行頁(yè)面:

相關(guān)文章

  • MSAgent 詳細(xì)解說(shuō)

    MSAgent 詳細(xì)解說(shuō)

    MSAgent 詳細(xì)解說(shuō)...
    2006-11-11
  • JavaScript可視化與Echarts詳細(xì)介紹

    JavaScript可視化與Echarts詳細(xì)介紹

    提到數(shù)據(jù)可視化相信大家都不陌生,它能夠?qū)我坏臄?shù)據(jù)通過(guò)合適的可視化圖表類型表現(xiàn)出來(lái),使其更加直觀的展現(xiàn)數(shù)據(jù)的變化趨勢(shì)、對(duì)比、峰值等等。其實(shí)在前端開發(fā)中,數(shù)據(jù)可視化也尤為重要,在眾多圖表庫(kù)中,echarts就是最常見的圖表庫(kù)之一
    2022-07-07
  • 淺談Postman解決token傳參的問(wèn)題

    淺談Postman解決token傳參的問(wèn)題

    下面小編就為大家分享一篇淺談Postman解決token傳參的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • JS加載解析Markdown文檔過(guò)程詳解

    JS加載解析Markdown文檔過(guò)程詳解

    這篇文章主要介紹了JS加載解析Markdown文檔過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 關(guān)于javascript中this關(guān)鍵字(翻譯+自我理解)

    關(guān)于javascript中this關(guān)鍵字(翻譯+自我理解)

    在傳統(tǒng)面向?qū)ο笳Z(yǔ)言中,this關(guān)鍵字是個(gè)很乖的小孩,從不亂跑,該是誰(shuí)的就是誰(shuí)的。可是在JavaScript中,我們發(fā)現(xiàn)它不那么乖,有時(shí)甚至把我們搞的暈頭轉(zhuǎn)向的。所以有必要對(duì)它稍微做個(gè)總結(jié)。
    2010-10-10
  • 關(guān)于TypeScript聲明合并

    關(guān)于TypeScript聲明合并

    這篇文章主要介紹了關(guān)于TypeScript聲明合并,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別解析

    ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別解析

    var可以穿透控制語(yǔ)句、條件語(yǔ)句這樣的作用域,導(dǎo)致變量沖突經(jīng)常發(fā)生,這篇文章主要介紹了ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別,需要的朋友可以參考下
    2022-09-09
  • JavaScript使用rem實(shí)現(xiàn)移動(dòng)頁(yè)面響應(yīng)式

    JavaScript使用rem實(shí)現(xiàn)移動(dòng)頁(yè)面響應(yīng)式

    在當(dāng)今的移動(dòng)互聯(lián)網(wǎng)時(shí)代,確保網(wǎng)頁(yè)在各種移動(dòng)設(shè)備上都能完美顯示是至關(guān)重要的,響應(yīng)式設(shè)計(jì)是實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵技術(shù)之一,而使用 rem 單位是實(shí)現(xiàn)移動(dòng)端響應(yīng)式頁(yè)面的一種有效方法,本文將詳細(xì)介紹如何使用 rem 單位來(lái)創(chuàng)建響應(yīng)式的移動(dòng)端頁(yè)面,需要的朋友可以參考下
    2025-04-04
  • Bootstrap datepicker日期選擇器插件使用詳解

    Bootstrap datepicker日期選擇器插件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap datepicker日期選擇器插件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 第四篇Bootstrap網(wǎng)格系統(tǒng)偏移列和嵌套列

    第四篇Bootstrap網(wǎng)格系統(tǒng)偏移列和嵌套列

    這篇文章主要介紹了Bootstrap網(wǎng)格系統(tǒng)偏移列和嵌套列的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06

最新評(píng)論

本溪| 乌兰县| 唐海县| 濮阳县| 西平县| 德江县| 泽州县| 吉木乃县| 高唐县| 蒙城县| 天台县| 和顺县| 泽库县| 历史| 渝中区| 自贡市| 连城县| 通辽市| 兴业县| 凤城市| 乐至县| 盱眙县| 门头沟区| 昂仁县| 富源县| 卓资县| 崇州市| 巴里| 商丘市| 澜沧| 德格县| 五峰| 西乌珠穆沁旗| 绥化市| 洪湖市| 瑞丽市| 漳浦县| 岳普湖县| 綦江县| 临潭县| 绍兴市|