JavaScript单例模式

单例模式的定义是:

  1. 保证一个类仅有一个实例。
  2. 提供一个访问它的全局访问点。

由于JavaScript是基于对象编程,没有类的概念。所以可以直接将全局变量当成的单例来使用。但是该方法会污染全局作用域,且易被覆盖。可通过以下方式解决。

  • 使用命名空间
var namespace1 =  {
    a: function(){
       alert(1);
    },
    b: function() {
      alert(2);
    }
};

可用以下方法动态创建命名空间(引自Object-Oriented JavaScript一书):

var MyApp = {};

MyApp.namespace = function(name) {
    var parts = name.split('.');
    var current = MyApp;
    for(var i in parts) {
        if(!current[parts[i]]){
            current[parts[i]] = {};
        }
        current = current[parts[i]];
    }
};

MyApp.namespace('event');
MyApp.namespace('dom.style');

//上述代码结果:
MyApp = {
    event:{},
    dom:{
        style:{}
    }
};
  • 使用闭包封装私有变量
var user = (function(){
    var __name = 'sven',
        __age = 29;
        
    return {
        getUserInfo: function() {
            return __name + '-' + __age;
        }
    }
})

单例模式的应用

以上两种模式需要事先加载,影响性能,可以使用惰性单例模式实现需要时加载。
使用案例:

  1. 创建div浮窗,如登录浮窗,在页面中唯一。
  2. ajax渲染列表时的事件委托绑定,事件只需绑定一次。

创建单例管理模块

var getSingle = function(fn) { //fn为无单例模式的功能构造函数
    var result; // 闭包保存创建的单例
    
    //返回具有单例模式的构造函数
    //存在单例返回原单例,不存在则使用fn创建该构造函数的单例
    return function() {
        return result || (result = fn.apply(this,arguments));
    }
}

编写功能构造函数,并使用单例管理模块创建其单例版

var createLoginLayer = function(){
    var div = document.createElement('div');
    div.innerHTML = '我是登录浮窗';
    div.style.display = 'none';
    document.body.appendChild(div);
    return div;
}; 

var createSingleLoginLayer = getSingle(createLoginLayer);

document.getElementById('loginBtn').onclick = function(){
    var loginLayer = createSingleLoginLayer();
    loginLayer.style.display = 'block';
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 单例模式的定义:保证一个类仅仅有一个实例,并提供一个访问他的全局访问点。意义:有的时候,一些对象我们仅仅需要...
    kim_jin阅读 5,664评论 0 1
  • 定义: 保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点; 实现原理: 利用闭包来保持对一个局部变量的...
    Searchen阅读 1,716评论 0 2
  • 定义 确保一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式使用的场景 比如线程池、全局缓存等。我们所熟...
    缘自世界阅读 2,425评论 0 1
  • 单例模式 单例模式之所以这么叫,是因为它限制一个类只能有一个实例化对象。经典的实现方式是,创建一个类,这个类包含一...
    伯纳乌的追风少年阅读 1,690评论 0 0
  • 单例模式的思想在于保证一个特定类仅有一个实例,并提供一个访问它的全局访问点。 使用对象字面量在使用对象字面量创建对...
    滚石_c2a6阅读 1,209评论 0 0