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 クロージャーが行う方法です。

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 に答える