zoukankan      html  css  js  c++  java
  • 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] || {};
            }
        }

  • 相关阅读:
    Linux下Utuntu使用
    模拟退火算法
    五大常用算法:分治、动态规划、贪心、回溯和分支界定
    图像处理与机器视觉行业分析
    数字图像处理知识结构整理
    算法之美--读书笔记
    台湾大学林轩田和李宏毅机器学习课程
    下载SCI论文
    OpenCV机器学习库函数--SVM
    fmri的图像数据在matlab中显示,利用imagesc工具进行显示,自带数据集-by 西南大学xulei教授
  • 原文地址:https://www.cnblogs.com/oceanxing/p/2869611.html
Copyright © 2011-2022 走看看