JavaScript设计模式-单例模式

136 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

单例模式是JavaScript中最常见的一种模式。该模式为我们提供一个命名空间。比如我们使用的jQuery库就是一个单例模式,单例模式就为它提供了一个命名空间jQuery,用来隔离当前命名空间与外部空间的函数,让代码环境不容易被污染

image.png

比如我们在页面中添加了很多变量,比如你定义的绑定事件方法on,如果其他人要为我们的页面添加需求,增加代码而定义一个on变量或者重写了on方法,可能会引起冲突

命名空间

由于我们在日常写代码中需要对各种方法和属性命名,如果在团队合作中存在多人开发同一个页面,就可能会存在方法和属性同名的情况,所以我们需要给各位开发人员都约束一个命名空间,在各自的空间中发布自己的方法和属性,这样一来就不会因为同名的原因而导致方法之间的冲突,比如A程序员定义了一个空间A,B定义了一个命名空间B,访问A和B的方法,比如A.getName和B.getName

image.png

比如上面的这些函数,我们就可以放到一个对象中,将对象作为一个命名空间,将其中的函数和属性与外面的函数和属性进行隔离,这样可以减少在日常开发中代码之间的冲突

但是我们可以看到这里的一个写法,我们看到css函数中我们使用了g(id),这样其实是错误的写法,正确的写法硬是使用this.g(id),调用自己对象中的g函数,这样就g和css函数都是身处于同一个对象中,属于同一个命名空间中。

设计模块

除了单列模式定义命名空间外,单例模式还可以用来管理代码库的各个模块,比如我们想要实现一个库的时候,我们命名为modules库,当我们需要封装一些dom操作的方法和函数的时候,就可以放到modules中的dom模块中,比如需要对浏览器事件添加冒泡等方法时候,可以放到modules中的event模块

image.png

规范代码库

随着开发功能越来越多我们可以对我们自己的代码进行规范管理,比如设计一个自己的小型代码库,比如我们有一个A库,它包含公用模块、工具模块、ajax模块和其他模块,那么我们就可以自己定制一个如下的小型代码库

image.png

我们可以通过以下形式获取库中的函数

image.png

静态变量

JS本身并没有static的关键字,所以在理论上任何的变量都是可以修改的,但之前我们在学习了JS的类中可以设置静态变量,静态变量的特点是只能访问不能修改并且无创建后就能使用,如果将变量放在一个函数内部,通过特权方法访问,并且不提供赋值变量的方法,只提供获取变量的方法,就做到限制变量的修改并且可以供外界访问的需求,如何在外部访问函数内部的方法,我们就需要让函数在创建的时候执行一次,然后返回取值方法

var fun1 = (function (){
    var f1 = {
        age:11
    }
    return {
        getName : function(){
            return f1.age
        }
    }
})()
console.log(fun1.getName());

惰性单例

有些时候对于单例对象需要延迟创建,所以在单例中还存在一种延迟创建的形式,有人也称之为‘惰性创建

image.png