4

我在 JavaScript 中使用以下单例模式:

  var exampleClass =(function(){ 
                        //private
                        var a ="test"; 
                        function PrivateMethod()
                        {
                            return a;
                        }
                        //public
                        return{  
                            Test: function() { 
                                   alert(PrivateMethod()); 
                                  } 
                        }
                      })(); 

当我阅读 StackOverflow 时,我看到了很多其他的 Singleton 实现,我开始怀疑我是否不能让我的更好。我希望有人能告诉我这样做是对还是错。

4

5 回答 5

3

这取决于您想要实现的目标,因为不同的实现将有不同的好处和限制。

最简单的实现只是一个对象字面量:

var singleton = {
    property: "foo",
    method: function() {
        alert('bar');
    }
}

您在问题中提到的实现通过将方法封装在闭包中并返回应该公开的内容来允许公共和私有方法。

这是一个替代方案,它同样允许公共和私有方法并且更具可扩展性:

function MySingletonClass() {

  if ( arguments.callee._singletonInstance )
    return arguments.callee._singletonInstance;
  arguments.callee._singletonInstance = this;

  this.Foo = function() {
    // ...
  }
}

var a = new MySingletonClass()
var b = MySingletonClass()
Print( a === b ); // prints: true
于 2012-11-07T09:02:52.590 回答
1

这是我的。

区别在于:

  • 在顶部声明的所有函数
  • 默认情况下所有函数都是私有的
  • 所有功能都可以访问其他功能
  • 公共功能映射在底部

改进如下:

  • 如果要将函数从私有移动到公共或反之亦然,则不必移动代码,只需更改代码底部的映射
  • 所有函数都可以访问私有和公共函数(因为默认情况下所有函数都是私有的)

    var exampleClass =(function(){ 
    
                    //private
                    var a ="test"; 
    
                    //declare here all functions 
                    //(both for pass jslint validation and is good to have a list
                    //of all available functions, in case of classes with a lot of code
    
                    var PrivateMethod,
                    Test1,
                    Test2;
    
                    PrivateMethod = function()
                    {
                        return a;
                    };
    
                    Test1 = function()
                    {
                        return PrivateMethod();
                    };
    
                    Test2 = function()
                    {
                        return Test1();
                    };
    
    
                    //public
                    //Expose function you want to have pubblic
                    return{  
                        Test1: Test1,
                        Test2: Test2 
                    }
                  })(); 
    
于 2012-11-07T09:03:24.550 回答
0

我正在使用这种模式:

var SingletonConstructor;
(function() {
    var instance;
    SingletonConstructor = function() {

        if (typeof instance !== 'undefined')
           return instance;

        var a = "a";

        function PrivateMethod() {
            return a;
        }

        return instance = this;
    };
})();
于 2012-11-07T08:59:06.173 回答
0

这就是 Google Closure 的做法:

http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/base.js#427

于 2012-11-07T09:06:25.527 回答
0

我喜欢以下模式:

function MyClass(){
    if(MyClass.instance){
        return MyClass.instance;
    }
    MyClass.instance = this;

    //constructor code goes here
}

var a = new MyClass();
var b = new MyClass();

console.log(a == b); //true
于 2012-11-07T09:09:26.543 回答