我做了一个简单的单例模式示例,但在两种情况下都给出了空白对象。请有人帮忙吗?
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());
正如我在评论中所说,问题是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)
}
};
如果万一这可能对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 )