javascript的單例模式


單例模式(Singleton),整個運行期間只會被初始化一次。該模式簡單易懂,運用也很廣泛。可以用它來聚合公共的方法,形成一個工具類,對外提供api。

1. 單例模式的基本結構

    var Singleton = {

        attr1: 'test1',

        attr2: 10,

        method: function(){

        ...

        },

        ...

    }

    這就是一個單例對象,Singleton是全局變量,js載入時被初始化一次。

    jquery就是一個很大的單例  (function(){var jquery=(function(){})();window.jQuery = window.$ = jQuery;})(window); 

2. 擁有私有變量的單例模式

    jascript的對象在運行期間是可以直接修改的,也沒有其他面向對象語言的private等關鍵字。一些方法又不想被外面直接調用或者修改。

    2.1 私有方法命名方法 _getName,方法名稱前加下划線,約定此類方法或變量為私有

        var Singleton = {

            _value: '23s',

            _stringSplit: function(str, delimeter){...},

        }

    2.2 閉包

        var Singleton = (function(){

            var titileId = "rules";

            function closePanel(id){

                ....

            }

            return {

                publicAttr: 1,

                publicMethod: function(){

                    closePanel(this.publicAttr);

                }

           }

        })();

        titleId屬性和closePanle因為在閉包內部,所有成了私有變量,外部不可訪問和修改。

        titleId屬性聲明的時候必須加var關鍵字,不然就變成一個全局變量。

3. lazy初始化

    由於單例對象一直存在內存之中,如果比較大的實例,一開始就初始化,代價比較高,可以等到需要的時候再初始化

    var Singleton = (function(){

        var uniqueInstance;

        function constructor(){

            var privateAttr = "";

            function privateMethod(){}

            return {}

        }

        return {

            getInstance: function(){

                if(!uniqueInstance){

                    uniqueInstance = new constructor();

                }

                return uniqueInstance;

            }

       }

    })();

4. 命名空間

    一個頁面會載入多個js,全局變量和方法會有沖突或覆蓋的風險。把變量和方法都放到一個單例對象下面,避免沖突。

    var MyNamespace = {

       

    }

    一個創建命名空間的方法

    function createNameSpace(spaceStr){
        var space = spaceStr.split(".");
        var parent = window, name = "";
        for(var i = 0; i < space.length; i++){
            name = space[i];
            parent = parent[name] = parent[name] || {};
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM