我最近正在阅读 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
答案 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
对象定义共享方法,因为会有一个实例。 (因此函数表达式而不是函数声明)。
这种设计的所有美妙之处在于范围链和封闭(公共功能)的好处。