【问题标题】:What is wrong with my singleton design pattern?我的单例设计模式有什么问题?
【发布时间】:2017-08-31 10:40:31
【问题描述】:
 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 is undefined, 但是,如果我删除了该函数的 IIFE 环绕,它会完美运行,所以我不明白这是为什么?

【问题讨论】:

    标签: javascript design-patterns singleton iife


    【解决方案1】:

    在最初的调用中,您没有返回任何内容,您只是在初始化它 - 因此是 undefined。在初始化调用之后放置 return instance 应该可以解决问题。

    【讨论】:

    • 我很抱歉,但我仍然很困惑为什么当我删除 iife 时即使没有返回语句 `return function(){ if(!instance) { instance = init(); } 其他 { 实例; } } `
    【解决方案2】:

    您要么想添加一个return 关键字

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

    或省略else:

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

    【讨论】:

      【解决方案3】:

      删除退货中的 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);

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-03
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          • 2013-05-20
          • 1970-01-01
          • 2023-04-04
          相关资源
          最近更新 更多