簡體   English   中英

JavaScript中的單例模式

[英]Good Singleton Pattern in JavaScript

我在JavaScript中使用以下Singleton模式:

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

當我通過StackOverflow閱讀時,我看到了很多其他的Singleton實現,我開始懷疑我是否能讓自己變得更好。 我希望有人能告訴我這樣做是對是錯。

這取決於您想要實現的目標,因為不同的實現將具有不同的好處和限制。

最簡單的實現只是一個對象文字:

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

這是我的。

差異是:

  • 所有函數都在頂部聲明
  • 默認情況下,所有函數都是私有
  • 所有功能都可以訪問其他功能
  • 公共函數映射在底部

改進是:

  • 如果你想將一個函數從私有移動到公共或反之,你不必移動代碼,只改變代碼底部的映射
  • 所有函數都可以訪問私有和公共函數(因為默認情況下所有函數都是私有的)

     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 } })(); 

我正在使用這種模式:

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

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

        var a = "a";

        function PrivateMethod() {
            return a;
        }

        return instance = this;
    };
})();

我喜歡以下模式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM