-1

私は最近Javascriptパターンを読んでいます.そして、シングルトンパターンについて話しているとき、私は以下のコードを理解していません:

function Universe(){
    var instance;
    Universe=function Universe(){
        return instance;
    };
    Universe.prototype=this;

    //the new Universe below,refers to which one?The original one,
    //or the one:function(){return this;} ??
    instance=new Universe();

    instance.constructor=Universe;

    instance.bang="Big";

    return instance;
}
Universe.prototype.nothing=true;
var uni=new Universe();
Universe.prototype.everything=true;
var uni2=new Universe();

uni===uni2;//true
4

2 に答える 2

2

ここではあまり進んでいません。主な焦点はコンストラクターにあるべきです。インスタンス化されたユニバースを返します。したがって、それを呼び出す人は誰でも同じインスタンスへの参照を持ちます。コンストラクターがどのようにユニバース関数を指しているのかに注目してください。

new キーワードは新しいインスタンスが作成されていることを意味するため、このパターンは使用しません。JS では、名前空間パターンでよく使用されるオブジェクト リテラルを完全に使用できます。

(function(ns, window, undefined) {
    ns.singleton = {
        bang: 'Big'
    };

    window.ns = ns;
})(ns || {}, window);

console.log(window.ns.singleton.bang === 'Big');

確かに、これは真のシングルトンではありませんが、インスタンス化する必要はなく、それを使用する人は誰でも同じ値を持つことになります。

その他のシングルトンの実装については、Javascript: 最高のシングルトン パターンを参照してください。

于 2012-11-15T06:07:45.870 に答える
0

あなたのコードは乱雑です。

私はこのパターンを使用します:

var universe = function(){

  var bang = "Big"; //private variable

  // defined private functions here    

  return{  //return the singleton object 
    everything : true,
    // or nothing : true, I don't guess your logic

    // public functions here (closures accessing private functions and private variables)
    getBang : function(){ return bang; } 
  };
}();

次に、たとえば次のように呼び出すことができます。

alert(universe.everything); // true
alert(universe.getBang()); //true
alert(universe.bang); //Undefined property ! Cause private ;)

これはsingletonprototypeであるため、インスタンスが 1 つになるため、オブジェクトに共有メソッドを定義する必要はありません。(したがって、関数宣言ではなく関数式)。

この設計のすべての美しさは、スコープ チェーンとクロージャ (パブリック関数) の利点です。

于 2012-11-16T13:20:05.710 に答える