JavaScript之单例模式

单例模式的思想在于保证一个特定类仅有一个实例,并提供一个访问它的全局访问点。

  1. 使用对象字面量
    在使用对象字面量创建对象时,实际上就创建了一个单例。
var obj={
  name: value
}

带私有变量和私有方法的单例:

var mySingleton = function () {

    /* 这里声明私有变量和方法 */
    var privateVariable = 'something private';
    function showPrivate() {
        console.log(privateVariable);
    }

    /* 公有变量和方法(可以访问私有变量和方法) */
    return {
        publicMethod: function () {
            showPrivate();
        },
        publicVar: 'the public can see this!'
    };
};
  1. 使用new操作符
function Universe() {

    // 判断是否存在实例
    if (typeof Universe.instance === 'object') {
        return Universe.instance;
    }

    // 其它内容
    this.start_time = 0;
    this.bang = "Big";

    // 缓存
    Universe.instance = this;

    // 隐式返回this
}

// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true

这个解决方法非常直接,唯一的缺点instance属性是公开的,有被修改的风险。

  1. 重写构造函数
function Universe() {

    // 缓存的实例
    var instance = this;

    // 其它内容
    this.start_time = 0;
    this.bang = "Big";

    // 重写构造函数
    Universe = function () {
        return instance;
    };
}

// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true

第一次调用原始构造函数,像往常一样返回this。而第二次开始将执行重写的构造函数。但是会丢失所有在初始定义和重定义时刻之间添加到它里面的属性。

1.使用闭包封装构造函数和实例

var Universe;

(function () {

    var instance;

    Universe = function Universe() {

        if (instance) {
            return instance;
        }

        instance = this;

        // 其它内容
        this.start_time = 0;
        this.bang = "Big";
    };
} ());

//测试代码
var a = new Universe();
var b = new Universe();
alert(a === b); // true

参考:《JavaScript模式》
]http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html[(http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html)
http://www.dengzhr.com/js/1125

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,396评论 2 17
  • Javascript 模式 模式:更好的实践经验,有用的抽象化表示和解决一类问题的模板 设计模式 编码模式 反模式...
    newDasiykoo阅读 2,490评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,083评论 19 139
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 7,247评论 1 8
  • C 语言中 static 关键字的作用 在模块(文件)内的 static 全局变量可以被模块内所用函数访问,但不能...
    阳光的影子v阅读 3,741评论 0 2

友情链接更多精彩内容