2012-11-07 56 views
4

我用下面的Singleton模式在JavaScript:好Singleton模式在JavaScript

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

我走過的StackOverflow閱讀我看到很多單身的其他實現的,我開始懷疑,如果我不能讓我的更好。 我希望有人能告訴我這樣做是對還是錯。

+0

什麼是實際使用這種模式在Javascript? – madhairsilence

+0

主要用於將所有函數和變量從其他函數中分離出來,但我也有一個使用其私有變量保持最後狀態的popuphelper。我希望所有開發人員使用該類,而不是實例化一個新類。所以應用程序中只能存在一個「實例」。例如,保留一些彈出框的座標作爲全局變量並不合適。我認爲使用Popup.Open()並處理該類中的所有邏輯和變量會更好。 –

+0

一些很好的例子:http://stackoverflow.com/questions/1479319/simplest-cleanest-way-to-implement-singleton-in-javascript –

回答

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 
+1

您可以多次調用構造函數以允許原型繼承 – DanS

0

我使用這個模式:

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

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

     var a = "a"; 

     function PrivateMethod() { 
      return a; 
     } 

     return instance = this; 
    }; 
})(); 
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 
           } 
           })(); 
    
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