Javascript中的单例模式

时间:2012-11-15 05:59:27

标签: javascript design-patterns singleton

我最近正在阅读 Javascript Patterns 。当我谈到单身人士模式时,我不明白下面的代码:

function Universe(){
    var instance;
    Universe=function Universe(){
        return instance;
    };
    Universe.prototype=this;

    //the new Universe below,refers to which one?The original one,
    //or the one:function(){return this;} ??
    instance=new Universe();

    instance.constructor=Universe;

    instance.bang="Big";

    return instance;
}
Universe.prototype.nothing=true;
var uni=new Universe();
Universe.prototype.everything=true;
var uni2=new Universe();

uni===uni2;//true

2 个答案:

答案 0 :(得分:2)

这里没什么了。主要焦点应该是构造函数,它会为您返回一个实例化的Universe。所以任何调用它的人都会引用同一个实例。注意构造函数如何指向Universe函数。

我不会使用这种模式,因为新关键字意味着正在创建一个新实例,而且对我来说似乎有点太深奥了。在JS中,您可以完全拥有一个对象文字,通常与命名空间模式一起使用:

(function(ns, window, undefined) {
    ns.singleton = {
        bang: 'Big'
    };

    window.ns = ns;
})(ns || {}, window);

console.log(window.ns.singleton.bang === 'Big');

当然,这不是一个真正的单身人士,但它不需要实例化,任何使用它的人都会有相同的值。

有关更多单例实现,请参阅Javascript: best Singleton pattern

答案 1 :(得分:0)

你的代码很乱。

我会使用这种模式:

var universe = function(){

  var bang = "Big"; //private variable

  // defined private functions here    

  return{  //return the singleton object 
    everything : true,
    // or nothing : true, I don't guess your logic

    // public functions here (closures accessing private functions and private variables)
    getBang : function(){ return bang; } 
  };
}();

然后您可以调用例如:

alert(universe.everything); // true
alert(universe.getBang()); //true
alert(universe.bang); //Undefined property ! Cause private ;)

因为它是 singleton ,所以不需要为prototype对象定义共享方法,因为会有一个实例。 (因此函数表达式而不是函数声明)。

这种设计的所有美妙之处在于范围链和封闭(公共功能)的好处。