JS 設計模式 -- 單例模式

本文參考鏈接:湯姆大叔的博客
深入理解JavaScript系列(25):設計模式之單例模式

前言

在傳統(tǒng)開發(fā)工程師眼里只泼,單例就是保證一個類只有一個實例,實現(xiàn)的方法一般是先判斷實例存在與否未妹,如果存在直接返回,如果不存在就創(chuàng)建了再返回空入,這就確保了一個類只有一個實例對象络它。在JavaScript里,單例作為一個命名空間提供者执庐,從全局命名空間里提供一個唯一的訪問點來訪問該對象

在JavaScript里,實現(xiàn)單例的方式有很多種导梆,其中最簡單的一個方式是使用對象字面量的方法轨淌,其字面量里可以包含大量的屬性和方法:

下面是我在 FIS從入門到放棄 這個筆記中使用的示例

//這個是一個典型的很簡單的單例模式的例子
var message = {
    //init 是接收參數(shù)的
    init: function() {
        var me = this;
        console.log('message init');
        me.render();
        me.bind();
    },
    //render 是負責 render頁面 
    render: function() {
        var me = this;
        me.btn = $('#btn');
    },
    //bind 是負責綁相應的元素
    bind: function() {
        var me = this;
        //jQuery.proxy( function, context )
        //function為執(zhí)行的函數(shù),content為函數(shù)的上下文this值會被設置成這個object對象
        me.btn.on('click',$.proxy(me._go,this));
    },
    _go:function(e){
        console.log(e.target);
    }
}
//將方法導出 這個 module.exports 方法是從 layout.tpl 中引用的 mod.js  中來的
module.exports = message;

下面是我在公司項目中的首次嘗試

//這里用的是單例模式中最簡單的以字面量的形式進行書寫的
var XYQAJS = {
    //將這個對象初始化
    init: function () {
        var _me = this;
        _me.render();
        _me.bind();
        _me.imgslide();
    },
    //提供所有需要用到的操作元素
    render: function () {
        var _me = this;
        _me.openAskBtn = $('#openAskBtn');
        _me.closebtn = $('.conform').find('.cf_closebtn');
        _me.QASearchBtn = $('#QASearchBtn');
    },
    //將所有的事件都放到這里綁定
    bind: function () {
        var _me = this;
        //$.proxy(_me.openpopup, this)  返回的其實是 _me.openpopup() 這個函數(shù)的上下文
        //【我要提問】彈窗切換
        _me.openAskBtn.on('click', $.proxy(_me.openpopup, this));
        _me.closebtn.on('click', $.proxy(_me.closepopup, this));
        _me.QASearchBtn.on('click', $.proxy(_me.searchkeyword, this));
    },
    //右側(cè)活動輪播圖
    imgslide:function(){
        jQuery("#slideBox1").slide({ mainCell: ".bd ul", autoPlay: true, interTime: 3000, effect: "fold", switchLoad: "_src" });
    },
    //打開彈窗
    openpopup: function () {
        $('.conformbg,.conform').show();
    },
    //關閉彈窗
    closepopup: function () {
        $('.conformbg,.conform').hide();
    },
    //搜索關鍵詞
    searchkeyword: function () {
        var word = $('#keyword').val();
        //提交數(shù)據(jù)

    }
}
XYQAJS.init();
  • 在瀏覽器的控制臺中輸出會發(fā)現(xiàn)看尼,將所有的東西都綁在了唯一的 XYQAJS 對象上
image.png

接著我又將上面的方法寫成可 new 可擴展递鹉、繼承的

//這里是使用的設計模式中的單例模式進行書寫的
var XYQACommon = (function(){
    var _module;
    if (_module) {
        return _module;
    }
    _module = this;
    //將這個對象初始化
    this.init = function () {
        var _me = this;
        _me.render();
        _me.bind();
        _me.imgslide();
    },
    //提供所有需要用到的操作元素
    this.render = function () {
        var _me = this;
        _me.openAskBtn = $('#openAskBtn');
        _me.closebtn = $('.conform').find('.cf_closebtn');
        _me.QASearchBtn = $('#QASearchBtn');
        _me.listMoreBtn = $(".wbn_det").find(".morebtn");

    },
    //將所有的事件綁定都放到這里
    this.bind = function () {
        var _me = this;
        //$.proxy(_me.openpopup, this)  返回的其實是 _me.openpopup() 這個函數(shù)的上下文
        //【我要提問】彈窗切換
        _me.openAskBtn.on('click', $.proxy(_me.openpopup, this));
        _me.closebtn.on('click', $.proxy(_me.closepopup, this));
        _me.QASearchBtn.on('click', $.proxy(_me.searchkeyword, this));
        _me.listMoreBtn.on('click', $.proxy(_me.listMoreShow, this));
    },
    //右側(cè)活動輪播圖
    this.imgslide = function () {
        jQuery("#slideBox1").slide({ mainCell: ".bd ul", autoPlay: true, interTime: 3000, effect: "fold", switchLoad: "_src" });
    },
    //打開彈窗
    this.openpopup = function () {
        $('.conformbg,.conform').show();
    },
    //關閉彈窗
    this.closepopup = function () {
        $('.conformbg,.conform').hide();
    },
    //搜索關鍵詞
    this.searchkeyword = function () {
        var word = $('#keyword').val();
        //提交數(shù)據(jù)

    },
    //詳情頁右側(cè) 發(fā)標公告 點擊下拉展示全部
    this.listMoreShow = function () {
        var _hide = $(this.listMoreBtn).siblings(".wbn_det_list").not(".active");
        //console.log(_hide);
        if (_hide.is(":hidden")) {
            _hide.slideDown(500);
        } else {
            _hide.slideUp(500);
        }
    }

    return _module;
});

$(function () {
    var xyqaCommon = new XYQACommon();
    xyqaCommon.init();
    xyqaCommon.addFn = function () {
        console.log(0);
    }
    console.log(xyqaCommon);
    var xyqaCommon2 = new XYQACommon();
    console.log(xyqaCommon2);
});
  • 上面的寫法可以使得這個 XYQACommon 對象可 new 可擴展、繼承藏斩,可以清楚的看到 xyqaCommon 執(zhí)行 init 之后對象上多了那些在 render 時掛載的 jq 元素躏结,還有就是在下面擴展了 addFn 并沒有影響到宿主
image.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狰域,隨后出現(xiàn)的幾起案子媳拴,更是在濱河造成了極大的恐慌,老刑警劉巖兆览,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屈溉,死亡現(xiàn)場離奇詭異,居然都是意外死亡抬探,警方通過查閱死者的電腦和手機子巾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來小压,“玉大人线梗,你說我怎么就攤上這事〉∫妫” “怎么了仪搔?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜻牢。 經(jīng)常有香客問我僻造,道長憋他,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任髓削,我火速辦了婚禮竹挡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘立膛。我一直安慰自己揪罕,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布宝泵。 她就那樣靜靜地躺著好啰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儿奶。 梳的紋絲不亂的頭發(fā)上框往,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音闯捎,去河邊找鬼椰弊。 笑死,一個胖子當著我的面吹牛瓤鼻,可吹牛的內(nèi)容都是我干的秉版。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茬祷,長吁一口氣:“原來是場噩夢啊……” “哼清焕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祭犯,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秸妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沃粗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筛峭,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年陪每,在試婚紗的時候發(fā)現(xiàn)自己被綠了影晓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡檩禾,死狀恐怖挂签,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盼产,我是刑警寧澤饵婆,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站戏售,受9級特大地震影響侨核,放射性物質(zhì)發(fā)生泄漏草穆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一搓译、第九天 我趴在偏房一處隱蔽的房頂上張望悲柱。 院中可真熱鬧,春花似錦些己、人聲如沸豌鸡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涯冠。三九已至,卻和暖如春逼庞,著一層夾襖步出監(jiān)牢的瞬間蛇更,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工赛糟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留派任,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓虑灰,卻偏偏與公主長得像吨瞎,于是被迫代替她去往敵國和親痹兜。 傳聞我的和親對象是個殘疾皇子穆咐,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 單例模式優(yōu)點 劃分命名空間澡刹,減少全局變量 組織代碼為一體象踊,便于閱讀維護 并非所有的對象字面量都是單例,比如模擬數(shù)據(jù)...
    bestvist閱讀 353評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法欣范,類相關的語法遗淳,內(nèi)部類的語法拍柒,繼承相關的語法,異常的語法屈暗,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 單例模式(SingletonPattern)一般被認為是最簡單拆讯、最易理解的設計模式,也因為它的簡潔易懂养叛,是項目中最...
    成熱了閱讀 4,253評論 4 34
  • 前言 本文主要參考 那些年种呐,我們一起寫過的“單例模式”。 何為單例模式弃甥? 顧名思義爽室,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,512評論 1 8
  • 見到你的第一眼, 我就知道你是我的菜 但卻不可能在我的盤子里
    風丶蘇子閱讀 185評論 0 3