JS设计模式之单例模式

单例模式: 又被称为单体模式,是只允许实例化一次的对象类,有以下几个功能:
1.管理命名空间,井井有条的管理对象上的属性和方法。

JS中有事件覆盖,例如在页面中定义的绑定方法on,如果日后其他人要为页面添加需求,增加代码定义而定义了一个on方法或者重写了on方法,会导致初始定义的on方法被覆盖,这个时候就可以用单例模式来管理命名空间。命名空间就是人们日常所说得namespace,它开辟出一个独立的空间,把相关的变量、属性或者方法放在里面,然年后通过空间名来访问空间内的东西,单例模式管理命名空间其实很常见,例如jQuery就是,引用jQuery的方法或者变量的时候,都需要使用一个‘$’符号,这个‘$’就是jQuery的命名空间名。

举一个小例子,定义一个Ming的命名空间

var Ming = {
    g: function (id) {
        return document.getElementById(id)
    },
    css: function (id, key, value) {
        this.g(id).style[key] = value;
    }
    //
}

2.模块分明–管理代码库中的各个模块
在JS中单例模式除了定义命名空间之外,还可以用来管理代码库中的各个模块,看一个小型代码库:

var A = {
    Util: {
        util_method1: function() {},
        util_method2: function() {},
    },
    Tool: {
        tool_method1: function() {},
        tool_method2: function() {}
    },
    Ajax: {
        get: function() {},
        post: function() {},
        //.....
    },
    Others: {
        //....
    }
}

当要使用公共模块、工具的时候,就可以像下面这样调用:
A.Util.util_method1();
A.Tool.tool_method1();
仔细看一下可以发现,用单例模式规范代码模块其实是管理命名空间的升级版,规范代码模块把命名空间里的东西又进一步进行了模块划分,让代码层次更加清晰。

3.管理静态变量
JS中没有类似static的这类的关键字,所以理论上定义的变量都是可以更改的,所以在JS中实现静态变量很重要。JS是一个非常灵活的语言,所以有这么一个办法,用单例模式定义变量,并且不提供赋值变量的方式,只提供获取变量的方式,这样的话,就可以做到限制变量的修改,并且可以供外界访问,为实现创建后就能使用这一需求,需要让创建的函数执行异议,此时我们创建的对象内保存静态变量通过取值器访问,最后将这个对象作为一个单例放在全局命名空间作为静态变量单例对象供他人使用。简单代码如下

var conf = (function () {
    //私有变量
    var conf = {
        MAX_NUM: 100,
        MIN_NUM: 1,
        coUNT: 1000
    }
    //返回取值器对象
    return {
    //返回取值器方法
    get: function (name) {
        return conf[name] ? conf[name] : null;
    }
    }
})()

你可能感兴趣的:(javascript)