2013-05-21 7 views
6

はシングルトンパターンに関する記事をたくさん読んで、そしていくつかのテストを行った後、私はこのようなシングルトンパターン(http://jsfiddle.net/bhsQC/1/)との間に差は認められなかっ:JavaScriptのシングルトンパターンと「この」

var TheObject = function() { 
    var instance; 

    function init() { 
     var that = this; 
     var foo = 1; 

     function consoleIt() { 
      console.log(that, foo); 
     } 
     return { 
      bar: function() { 
       consoleIt() 
      } 
     }; 
    } 
    return { 
     getInstance: function() { 
      if (!instance) { 
       instance = init(); 
      } 
      return instance; 
     } 
    }; 
}(); 
var myObject = TheObject.getInstance(); 
myObject.bar(); 

と、このようなコード(http://jsfiddle.net/9Qa9H/3/):

var myObject = function() { 
    var that = this; 
    var foo = 1; 

    function consoleIt() { 
     console.log(that, foo); 
    } 
    return { 
     bar: function() { 
      consoleIt(); 
     } 
    }; 
}(); 
myObject.bar(); 

彼らの両方がオブジェクトのインスタンスを1つだけ作り、彼らの両方がそれらのいずれかでwindow対象に「プライベート」のメンバー、thatポイントを持つことができます。後者のほうが簡単です。私が間違っているなら、私を修正してください。このような標準的なコンストラクタ(http://jsfiddle.net/vnpR7/2/)使用

var TheObject = function() { 
    var that = this; 
    var foo = 1; 

    function consoleIt() { 
     console.log(that, foo); 
    } 
    return { 
     bar: function() { 
      consoleIt(); 
     } 
    }; 
}; 
var myObject = new TheObject(); 
myObject.bar(); 

thatの正しい使用の利点を有するが、シングルトンではありません。

私の質問は:これらの3つのアプローチの全体的な長所と短所は何ですか?(問題がある場合は、Dojo 1.9を使用しているWebアプリケーションで作業しています。どちらの方法でも、このオブジェクトはDojoのrequireの内部にあります)。

+1

を単に好奇心から、なぜ誰かがJavaScriptでシングルトンパターンを使用するのでしょうか? var obj1 = {}申し訳ありませんofftopic –

+0

@KirillIvlevでシングルトン/モジュールパターンを使用すると、IIFEの内部に専用の変数と関数を持たせることができます。 OPからのシングルトンも同様に遅延ロードを適用するように見えます - 最初に呼び出されたときにインスタンス化するだけです。 –

+0

私はむしろ、自動起動関数を使ってコンストラクタを隠すために、次のようにします:http://jsfiddle.net/qFMcL/ – Niko

答えて

1

最初の2つの間に実際に大きな違いがあるとは思いません。

getInstanceの最初の文字は、Javaのような古典的なOOP言語のシングルトンパターンのようになります。

第2のアプローチは、古典的なOOP言語の静的クラスのように機能します。

明らかに、これらの問題は、すべてのシングルトンが同じであることを示しています(グーグル上で見れば、これには多くの素材があります)。

最後のアプローチは実際にはnewを使用していません - あなたは "コンストラクタ"からオブジェクトを返しています。明らかにこれはシングルトンではなく、それ自体が好ましい方法です。

+0

私はこの質問のためにdownvotedする用意ができていますが、シングルトンの "issues" 「that」問題とは別に?そこにはたくさんの質問がありますが、私はちょうどよい答えを見つけることができません。 – Zemljoradnik

+1

ここにいくつかの良い答えがあります。それについては、http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons –

3

まあ、実際の違いは、シングルトンの構築の時間です。 2番目のアプローチでは、シングルトンがすぐに作成されます。最初に呼び出された後に初めてシングルトンが作成されます。シングルトンが何をメモリに必要としているかによって、これはアプリケーションに違いをもたらすかもしれません。たとえば、ユーザーが特定の操作を実行する場合にのみ、シングルトンが必要な場合があります。だから、もしユーザーがそれをやっていなければ、シングルトンをまったく初期化する必要がないのはいいでしょう。

また、シングルトンの初期化が計算上強烈な場合は、シングルトンが本当に必要になるまで、シングルトンの初期化を行うことをお勧めします。

編集:そしてJaniが言ったように、最後のものはシングルトンではないので、私はそれについて議論しませんでした。そうした場合

function FriendHandler(){ 
    if(FriendHandler.prototype.singleton){ 
     return FriendHandler.prototype.singleton; 
    } 

    if(!(this instanceOf FriendHandler)){ 
     return new FriendHandler(); 
    } 

    FriendHandler.prototype.singleton = this; 
... 
    this.selectFriends = function(firstName){ 
     ... 
    }; 
} 

::私はシングルトンを構築したい

+0

はい、私は建設の明白な時間を逃した。私の場合、それは問題ではありません。私はこの種の名前空間を使用しています。だから私は3番目のオプションを含んでいたのですが、なぜなら私はまだシングルトンを使わなければならないのかどうか分からないからです... – Zemljoradnik

+0

それでは、他の大きな違いはありません。あなたはシングルトンを使用しているべきであることについては、もちろん、それはまったく別のdicussionです:) – ghost23

関連する問題