我遇到单身模式,了解如何实现它非常棘手,我知道有些人建议大多数时候都避免使用它,所以下面是特定的单例变体,我觉得很容易理解,但不知怎的,我觉得这不是这种模式的最佳实现,你们能不能提出更好的形式。
var Foo = (function () {
var instance;
var _priVar = 2;
var log = function() {
console.log("Hello");
};
function Singleton(x, y) {
if (instance) {
return instance;
}
this.name = x;
this.age = y + _priVar;
this.log = log;
instance = this;
}
Singleton.getInstance = function () {
return instance || new Singleton();
}
return Singleton;
}());

和我的目标是当我们关注
时 var a = new Foo("Bob", 24);
var b = new Foo();
var c = Foo();
var d = Foo.getInstance();
我们仍然会
a == b // true
a == c // true
a == d // true
a.name // 'Bob'
b.age // 26
c.log // 'Hello'
d.name // 'Bob'
答案 0 :(得分:1)
最简单的单例,也称为模块模式,由对象文字组成:
var foo = (function () {
var x = "Bob",
y = 24,
_priVar = 2;
function log() {
console.log("Hello");
}
return {
name: x,
age: y + _priVar,
log: log
};
}());
如果你想引入延迟初始化,你可以使用额外的getInstance
函数,就像你的实现一样:
var getFoo = (function () {
var instance = null;
return function getFooInstance() {
if (instance) return instance;
var x = "Bob",
y = 24,
_priVar = 2;
function log() {
console.log("Hello");
}
return instance = {
name: x,
age: y + _priVar,
log: log
};
};
}());
单身人士不应该像你的代码那样使用构造函数,这是不必要的。如果您觉得需要传递参数进行初始化,不要使其成为单身。