2010-10-10 56 views
6

我目前知道在JavaScript中构建单例的两种方法。第一个:如何使用构造函数创建JavaScript单例式而不使用return?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

它是完美的,除了它没有可以运行初始化代码的构造函数。

二:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

第一个版本没有私人性质也不会有一个构造函数,但它是更快,更简单。第二个版本更复杂,更难看,但有一个构造函数和私有属性。

我不需要私人财产,我只是想要一个构造函数。有没有我缺少的东西,或者是我得到的唯一的两种方法?

+1

第二种方法不是“丑陋”;这是语言的一个自然部分。能够用函数创建函数是Javascript最强大的功能之一。 – Pointy 2010-10-10 12:00:29

回答

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

我认为这个解决方案并不清楚,因为使用这个构造函数是下一个:'new Singleton()'。这意味着开发人员希望每次他/她编写此代码时都会获得一个新实例。即'new Singleton()== new Singleton()'返回'true',但必须返回'false'。 – pto3 2017-05-15 07:54:11

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

这基本上是一样创建一个函数,然后立即assiging它的一个新的instace到变量单。像var singleton = new SingletonObject();

我反对使用单身这种方式在javscript的执行次序,但因为高度的建议是基于在该文件中放置的对象,而不是你自己的逻辑。

1

这是怎么回事?

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

这里是我的解决方案与封闭:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

测试:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

如果你只是寻找初始化你单身的地方,这个怎么样?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

简单而优雅。

相关问题