2017-08-31 8 views
1
var singleton = (function(){ 

    var instance; 

    function init(){ 

    var privateVariable = 'Private' 
    var privateMethod = function(){ console.log('Am private');} 

    return { 

    publicField : 'Public', 
    publicMethod : function(){ console.log('Am public');}, 
    randomVar : Math.random() 
    }; 
}; 

return function(){ 
    if(!instance) { instance = init(); } 
    else { return instance; } 
} 

})(); 

var single1 = singleton(); 
var single2 = singleton(); 

console.log(single1.randomVar == single2.randomVar); 

trueを返す、返さ:例外TypeError:single1は、 定義されていませんが、私は機能を中心に生命維持のラップを削除した場合、それは完璧に動作しますので、私はそれが理由で取得していませんか?私のシングルトンデザインパターンで何がわかりませんか?

答えて

1

instanceを返し、あなたはそれを初期化している - それゆえundefined。初期化呼び出しの後にreturn instanceを置くことは、そのトリックを行うべきです。あなたのリターンで他の部分を削除し

return function(){ 
    if(!instance) { instance = init(); } 
    return instance; 
} 
+0

私は申し訳ありませんが、私は生命維持を削除するとき、それはreturn文 'return関数(){ 場合(!インスタンス)がなくても働いていた、なぜ私はまだ混乱しています{インスタンス= init(); } else {instance; } } ' –

0

私はあなたがこれを望んだと思います。常に何かを返されていない最初の呼び出しでさえ初めて、

return function(){ 
    if(!instance) { 
     instance = init(); 
    } 
    return instance; 
} 
1

あなたはどちらかがreturnキーワード

return function(){ 
    if(!instance) { return instance = init(); } 
    else { return instance; } 
} 

またはelseを省略を追加します。

return function() { 
    if (!instance) { 
     instance = init(); 
    } 
    return instance; 
    } 

var singleton = (function() { 
 

 
    var instance; 
 

 
    function init() { 
 

 
    var privateVariable = 'Private' 
 
    var privateMethod = function() { 
 
     console.log('Am private'); 
 
    } 
 

 
    return { 
 

 
     publicField: 'Public', 
 
     publicMethod: function() { 
 
     console.log('Am public'); 
 
     }, 
 
     randomVar: Math.random() 
 
    }; 
 
    }; 
 

 
    return function() { 
 
    if (!instance) { 
 
     instance = init(); 
 
    } 
 
    return instance; 
 
    } 
 

 
})(); 
 

 
var single1 = singleton(); 
 
var single2 = singleton(); 
 

 
console.log(single1.randomVar == single2.randomVar);

関連する問題