《JS設(shè)計(jì)模式》讀書筆記(三)

標(biāo)簽:JS 設(shè)計(jì)模式


讀書筆記鏈接:


訂閱發(fā)布模式

其實(shí)就是事件機(jī)制输枯,可以實(shí)現(xiàn)異步房维。

通用的事件函數(shù)(自己寫的)

   var event = (function(){
    var _nsList = {},
        _defaultNs = '__default__';

    function useNamespace(ns) {
        if(ns === undefined && _nsList[_defaultNs]) return _nsList[_defaultNs];
        if(_nsList[ns]) return _nsList[ns]

        var method = {
            sub: {},
            preEvent: {}, // key:[[args],[args],...]
            listen: function(key, fn) {
                if(!this.sub[key]) {
                    this.sub[key] = [];
                }
                this.sub[key].push(fn);
                // 如果有已經(jīng)發(fā)生了的事件就立刻執(zhí)行
                if(this.preEvent[key]) {
                    this.preEvent[key].forEach(function(args, index){
                        fn.apply(fn, args)
                    })
                    this.preEvent[key] = null;
                }
            },
            trigger: function() {
                var args = [];
                for(var i=0,l=arguments.length;i<l;i++){
                    args.push(arguments[i])
                }
                key = args.shift();
                if(!this.sub[key]) {
                    // 預(yù)發(fā)布事件
                    if(!this.preEvent[key]) this.preEvent[key] = [];
                    this.preEvent[key].push(args)
                } else if(this.sub[key].length > 0){
                    // 正常trigger
                    this.sub[key].forEach(function(fn, index){
                        fn.apply(fn, args);
                    });
                }
            },
            once: function(key, fn) {
                // 如果存在預(yù)發(fā)布的事件,那么就直接執(zhí)行琅锻,并且不用監(jiān)聽了
                if(this.preEvent[key]) {
                    this.preEvent[key].forEach(function(args, index){
                        fn.apply(fn, args)
                    })
                    this.preEvent[key] = null;
                    return;
                }
                // 為了能夠外部調(diào)用remove來手動(dòng)刪除
                if(!this.sub[key+'_once']) this.sub[key + '_once'] = [];
                this.sub[key + '_once'].push(fn);
                var that = this;
                var onceFn = function() {
                    that.remove(key, onceFn, that.sub)
                    fn.apply(that, arguments)
                }
                this.listen(key, onceFn, this.sub)
            },
            remove: function(key, fn) {
                if(!this.sub[key] || this.sub[key].length === 0) return;
                if(!fn) this.sub[key] = [];
                else {
                    for(var i=this.sub[key].length;i--;){
                        if(this.sub[key][i] === fn) {
                            this.sub[key].splice(i, 1);
                            return;
                        }
                    }
                    // 檢查once的監(jiān)聽列表
                    if(!this.sub[key+'_once'] instanceof Array) return;
                    for(i=0,l=this.sub[key+'_once'].length;i<l;i++){
                        if(this.sub[key+'_once'][i] === fn) {
                            this.sub[key].splice(i, 1);
                            return;
                        }
                    }
                }
            },

        }
        if(ns === undefined) return _nsList[_defaultNs] = method;
        return _nsList[ns] = method;
    }
    return {
        defaultNs: useNamespace(),
        listen: function(key, fn) {
            this.defaultNs.listen(key, fn)
        },
        once: function(key, fn) {
            this.defaultNs.once(key, fn)
        },
        remove: function(key, fn) {
            this.defaultNs.remove(key, fn)
        },
        trigger: function(key, args) {
            this.defaultNs.trigger.apply(this.defaultNs, arguments)
        },
        useNamespace: useNamespace,
    }
}())
// 預(yù)發(fā)布
event.trigger('test', 10,213)
// 監(jiān)聽
var test;
event.listen('test', test = function(num,num2){
    console.log('testnum:',num,num2);
})
event.listen('test', function(msg){console.log(msg)})
event.once('test', function(msg){console.log('once', msg)})
// 觸發(fā)三個(gè)事件
event.trigger('test', 11,0)
// 刪除事件1
event.remove('test', test)
// 觸發(fā)事件2
event.trigger('test', 222, 222)

但這個(gè)模式也有缺點(diǎn),就是如果大量使用的話,會(huì)造成bug的跟蹤困難


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恼蓬,一起剝皮案震驚了整個(gè)濱河市惊完,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滚秩,老刑警劉巖专执,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異郁油,居然都是意外死亡本股,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門桐腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拄显,“玉大人,你說我怎么就攤上這事案站」螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蟆盐,是天一觀的道長(zhǎng)承边。 經(jīng)常有香客問我,道長(zhǎng)石挂,這世上最難降的妖魔是什么博助? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痹愚,結(jié)果婚禮上富岳,老公的妹妹穿的比我還像新娘。我一直安慰自己拯腮,他們只是感情好窖式,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著动壤,像睡著了一般萝喘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狼电,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天蜒灰,我揣著相機(jī)與錄音,去河邊找鬼肩碟。 笑死强窖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的削祈。 我是一名探鬼主播翅溺,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脑漫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了咙崎?” 一聲冷哼從身側(cè)響起优幸,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褪猛,沒想到半個(gè)月后网杆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伊滋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年碳却,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑旺。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼浦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筒主,到底是詐尸還是另有隱情关噪,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布乌妙,位于F島的核電站使兔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏藤韵。R本人自食惡果不足惜火诸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荠察。 院中可真熱鬧,春花似錦奈搜、人聲如沸悉盆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)焕盟。三九已至,卻和暖如春宏粤,著一層夾襖步出監(jiān)牢的瞬間脚翘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工绍哎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留来农,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓崇堰,卻偏偏與公主長(zhǎng)得像沃于,于是被迫代替她去往敵國(guó)和親涩咖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品繁莹,去做同樣的事情檩互,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,769評(píng)論 2 17
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined咨演、Nul...
    極樂君閱讀 5,518評(píng)論 0 106
  • 我的糖葫蘆串闸昨,糖葫蘆串……小小的女孩,扎著竄天辮薄风,手里舉著紅紅的糖葫蘆串饵较,卻哭的稀里嘩啦…… 在疲憊的夢(mèng)境中醒來時(shí)...
    Jessy自由行走的貓閱讀 467評(píng)論 0 4
  • 作者:海靈格我允許任何事情的發(fā)生。我允許村刨,事情是如此的開始告抄,如此的發(fā)展,如此的結(jié)局嵌牺。因?yàn)槲抑来蛲荩械氖虑椋际且?..
    十哥的九菇?jīng)?/span>閱讀 506評(píng)論 0 0