javascript单体模式

单体模式的思想在于保证一个特定类仅有一个实例。这意味着当第二次使用同一个类创建的新对象的时候,应该得到与第一个所创建的对象完全相同。

javacript中并没有类,因此对单体咬文嚼字的定义严格来说并没有意义。但是javascript具有new语法可使用构造函数来创建对象,而且有时需要使用这种语法的单体实现。这种思想在于当使用同一个构造函数以new操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针。

下面的代码显示了其预期行为:

var nui = new Universe();
var nui2 = new Universe();
nui === nui2; //结果为true

上面例子中,uni对象仅在第一次调用构造函数时被创建。在第二次创建时会返回同一个对象。这就是为什么nui === nui2,我们可以写出2种做法。

静态属性中的实例

下面代码是一个在Universe构造函数静态属性中缓存单个实例的列子:

function Universe(){

    //如果有实例,返回出去
    if(typeof Universe.instance === ‘object‘){
        return Universe.instance;
    }
    this.start_time = 0;
    this.bang = ‘Big‘;

    //缓存
    Universe.instance = this;
}
//测试
var nui = new Universe();
var nui2 = new Universe();
console.log( nui === nui2); //结果为true

正如你所看到的,这种做法的缺点在于instance是公开的。虽然其他代码不太可能会无意中修改该属性,但是仍有这种可能。

闭包中的实例

另外一种实现类似于类的单体方法是采用闭包来保护单个实例。

代码如下:

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 );  //结果为tur

这种做法会丢失所有在初始定义和重定义时刻时间添加到它里面的属性。这里的特定情况下,任何添加到Universe的原型中的对象都不会存在指向由原始实现所创建实例的活动连接。

通过下面一些测试,可以看到这个问题:

向原型添加属性

Universe.prototype.nothing = true;
var uni = new Universe();
Universe.prototype.everything = true;
var uni2 = new Universe();
开始测试:
仅有最初的原型
连接到对象上
console.log(uni.nothing); //结果为true
console.log(uni2.nothing); //结果为true

console.log(uni.everything); //结果为undefined
console.log(uni2.everything); //结果为undefined

结果看上去是正确的
console.log( uni.constructor.name ); //结果为Universe
console.log( uni.constructor === Universe); //结果为false

之所以uni.constructor不再与Universe()构造函数相同,是因为nui.constructor仍然指向了原始的构造函数,而不是重新定义的那个构造函数。

从需求上来说,如果需要使用原型和构造函数指针按照预期的那样运行,那么可以通过做一些调试来实现这个目标:

function Universe(){

    //缓存实例
    var instance;

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

    //保留原型属性
    Universe.prototype = this;

    //实例
    instance = new Universe();

    //重置构造函数指针
    instance.constructor =  Universe;

    //所有功能
    instance.start_time = 0;
    instance.bang = ‘Big‘;

    return instance;
}

//更新原型并创建实例
Universe.prototype.nothing = true; //结果为true
var uni = new Universe();
Universe.prototype.everything = true; //结果为true
var uni2 = new Universe();

//相同的实例
console.log( uni === uni2 ); //结果为true

//所有原型属性
console.log( uni.nothing && uni.everything && uni2.nothing && uni2.everything ); //结果为true

//构造函数指针正确
console.log( uni.constructor === Universe); //结果为true

  

  

javascript单体模式,布布扣,bubuko.com

时间: 2024-08-05 16:48:16

javascript单体模式的相关文章

javascript --- 设计模式之单体模式

单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚). 单体模式是javascript里面最基本但也是最有用的模式之一. 特点:1. 可以用来划分命名空间,从而清除全局变量所带来的危险或影响. 2. 利用分支技术来来封装浏览器之间的差异.   3. 可以把代码组织的更为一体,便于阅读和维护. 单体模式的基本写法: /* 最基本的单体模式 */ var her = { name: 'Anna', sex: 'wo

javaScript几种设计模式之一——单体模式

javaScript是一种弱类型.动态的.基于原型的语言,这种语言特性使得它非常容易. 甚至是普通的方式实现其中的一些模式. 单体模式的思想在于保证一个特定类仅有一个实例.这就意味着当您第二次使用同一个 类创建新对象的时候,应该得到与第一次所创建对象完全相同对象. 在javaScript中没有类,只有对象.当您创建一个新对象时,实际上没有其他对象与其 类似,因此新对象已经是单体了.使用对象字面量创建一个简单的对象也是一个单体的 例子. var obj ={ myprop:'my value' }

javascript中单体模式的实现

单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对象语言虽然在单体模式的思想上是一致的,但是实现起来还是有差异的. 首先来看看传统面向对象语言对于单体模式的定义:单体模式是只能被实例化一次并且可以通过一个众所周知的访问点来访问的类.这个定义有两点突出了传统面向对象语言的特征,即类和实例化,所以对于传统面向对象语言来讲,单体模式是建立在其类和实例化的

JavaScript设计模式——单体模式

一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减少网页中全局变量的数目. 2.在分支技术中用来封装浏览器之间的差异. 3.单体对象创建的命名空间可以快速清除全局变量. 4.增强模块性 关于单体模式的好坏,等你看完所有的讲解之后再告诉你哦....... 二:单体结构: 1.最简单的单体就是一个对象字面量. 1 var ProductTools={

JavaScript中的单体模式四种实现方式

1 /* 2 1 简单单体 3 */ 4 var Singleton = { 5 attr1: 1 , 6 method1:function(){ 7 //do sth 8 } 9 }; 10 alert(Singleton.attr1); 11 Singleton.method1(); 12 13 //单体模式一般用于划分命名空间 也就是区分是哪位开发人员的代码 例如 14 //张三工程师开发的代码 15 var Zhangsan = { }; 16 //把张三的逻辑写在这里面 17 Zhan

javascript设计模式之单体模式

一入前端深似海,刚入前端,以为前端只是div+css布局外加jquery操作DOM树辣么简单.伴随着对前端学习的深入,发现前端也是博大精深,而且懂得越多,才发现自己越无知,所以一定不能停下脚步的学习.原来前端也有设计模式,那么开始了解吧! 今天来学最简单的单体模式,其实就是简单的Object扩展 var calcYourShengXiao={ solar : ["甲","乙","丙","丁","午",&qu

js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计

说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的. 一.为你的 JavaScript 对象提供命名空间 <!DOCTYPE html> <html> <head> <title>为自己的js对象提供命名空间</title> </head> <body> <div>封装自己的数据和函数,防止和其他的库搞混了</div> <script> var jscbObject = {

js设计模式--单体模式

单体模式 -单体模式(singleton)是javaScript中最基本最有用的设计模式之一. -这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一 的变量进行访问.通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是 同样的全局资源. -简单单体 -闭包单体 -惰性单体 -分支单体 <script type="text/javascript" charset="utf-8"> // 单体模式(single

进阶前端高级攻城狮:使用单体模式设计原生js插件

----------基于上次写的jquery插件进行改造  http://www.cnblogs.com/GerryOfZhong/p/5533773.html 背景:jQuery插件依赖jQuery库,虽然jQuery使用十分广泛,但是对于移动开发或者在其他带宽需求需要注意的时候,就得考虑,因为我不可能完成一项技术相对来说引用了一个更大的库,这样之不值得的.所以原生js是所有浏览器都支持的一种语言,原生js相对来说就very good了,但是原生js相对新手或者没有很强基础的人来说还是相对比较