单例模式的简单JS示例不起作用

问题描述 投票:-1回答:2

我做了一个简单的单例模式示例,但在两种情况下都给出了空白对象。请有人帮忙吗?

var a = ( function(){
	
  var instance = {};

  function init() {
     return {
      name: "rosy",
      age: 29,
      printName: function(){
        console.log(this.name)
      }
    }
  }

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

console.log(a.getInstance());
console.log(a.getInstance());
javascript jquery design-patterns singleton
2个回答
2
投票

正如我在评论中所说,问题是instance初始化为{},这是事实,因此!instance永远不会为真。

仅有一个one instance变量,是为对匿名函数的one调用创建的。这就是它的全部要点,它跟踪单例。因此,使用伪造的值对其进行初始化(或将其保留为默认的undefined,这是伪造的):

var a = ( function(){
	
  var instance = null;

  function init() {
     return {
      name: "rosy",
      age: 29,
      printName: function(){
        console.log(this.name)
      }
    }
  }

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

const first = a.getInstance();
console.log(first);
const second = a.getInstance();
console.log(second);
console.log(first === second); // true
.as-console-wrapper {
    max-height: 100% !important;
}

就是说,如果您想延迟初始化,则只需要所有这些复杂性即可。否则,只需创建对象:

var a = {
    instance = {
      name: "rosy",
      age: 29,
      printName: function(){
        console.log(this.name)
      }
    }
};

然后a.instance是单例。

或仅:

var instance: {
  name: "rosy",
    age: 29,
    printName: function(){
      console.log(this.name)
    }
};

0
投票

如果万一这可能对T.J. Crowder回答,您可以创建一个实例并将其保存到一个变量,然后每次调用该方法时,您都可以返回该变量。我认为closure在这里起作用。

var a = ( function(){
	
  var instance = {
      name: "rosy",
      age: 29,
      printName: function(){
        console.log(this.name)
      }
    };

  return {
    getInstance: function(){
      return instance;
    }
  }
})();
let b = a.getInstance();
let c = a.getInstance();
console.log(b);
console.log(c);
console.log( b === c )
© www.soinside.com 2019 - 2024. All rights reserved.