5

javascriptでシングルトンを作成する2つの方法について読んでいます。単純なオブジェクトリテラルの方法と、プライベート変数を使用する場合はクロージャ手法を使用する方法です。

たとえば、効用関数を作成したいと思っています。

Singleton(classname);

どのクラスでも-「コンストラクター関数」ここで引数として渡すSingletonメソッドは、このクラスをSingletonオブジェクトに変換します。さらにnew Classname()、誰かが新しいclassname()を再度起動した場合、彼/彼女はいくつかを取得します。new Error ( "Already instantiated once, this is Singleton" );

ユースケースは以下の通りです-

function Circle() {this.name = "Circle";}
SingleTon(Circle);
var circle1 = new Circle(); // returns the circle instance
var circle2 = new Circle(); // throws Error "Already instantiated once, this is Singleton"

ここで「シングルトン」メソッドを定義しようとしています。

getInstanceメソッドを使用して--Singleton.getInstance(Circle)などのインスタンスを取得する同様の例を見てきましたが、「新しい」方法でインスタンスを作成する習慣のある別のプログラマーがしようとする上記の特定の質問を探しています彼のコードのどこかで2回目の起動new Circle(); を行い、エラーを受け取ります。

この方法でシングルトンを作成することは1つの問題ですが、主な問題は「エラー」をスローすることです。私の理解では、Circleコンストラクターをシングルトン関数のどこかで変更する必要があります。これを実現する方法がわかりません。

解決策はありますか?

前もって感謝します !!

4

3 に答える 3

4
function Singleton(param){
    var count = 0, old = window[param];
    window[param] = function(){
         if(++count <= 1) return old;
         else alert('NO WAY!'); 
    }
}

あなたはそれを次のように呼ぶでしょう:

Singleton('Circle');

デモ: http: //jsfiddle.net/maniator/7ZFmE/

これは、Circleまたは他の関数クラスがグローバルwindow名前空間にある場合にのみ機能することに注意してください。他の名前空間にあるものはすべて、完全に機能させるためにさらに操作が必要になります。

于 2012-11-05T19:51:17.337 に答える
1

これを試して:

Circle = function () {
  if (!(this instanceof Circle)) {
    // called as function
    return Circle.singleton || (Circle.singleton = new Circle());
  }
  // called as constructor

  this.name = "the circle";
};

これで、新しい演算子がなくても、シングルトンまたは新しい演算子を使用して取得できます

var mycircle = Circle();

例としてグローバル名を使用していることに注意してください。

var Circle = window.Circle = function () { //...
于 2012-11-05T20:09:50.190 に答える
0

もちろん、次のようなクロージャを使用する可能性のある単一インスタンスオブジェクトを作成することもできます。

var singlecircle = (new function(name) {
         this.name = name || "Default circle";}('squared')
    );
singlecircle.name; //=> 'squared'
于 2012-11-06T10:22:12.493 に答える