我的单件设计模式有什么问题?

时间:2017-08-31 10:40:32

标签: javascript design-patterns singleton iife

 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未定义, 但是,如果我删除了函数的IIFE包装,它完美地工作,所以我不知道为什么会这样?

4 个答案:

答案 0 :(得分:1)

在初始通话中你没有返回任何东西,你只是初始化它 - 因此undefined。在初始化调用之后放置return instance应该可以解决问题。

答案 1 :(得分:1)

您想要添加return关键字

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

或省略else

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

答案 2 :(得分:1)

在退货中删除其他部分。

  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);




答案 3 :(得分:0)

我想你想要这个。始终返回instance,即使是第一次

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