JavaScript 中的单例模式
Singleton pattern in JavaScript
下面是一个非常流行的 JavaScript 单例模式实现示例:
var mySingleton = (function() {
var instance;
function init() {
function privateMethod() {
console.log("I am private");
}
var privateVariable = "Im also private";
var privateRandomNumber = Math.random();
return {
publicMethod: function() {
console.log("The public can see me!");
},
publicProperty: "I am also public",
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
我已经考虑了一段时间,当我们可以用这个简单的代码实现相同的结果时,我并没有真正理解这种复杂性的必要性:
singleton = (function() {
var obj = {
someMethod: function() {}
}
return obj;
}());
我是不是忽略了什么?
是的,在大多数情况下您不需要这种复杂性,只需要做
var singleton = {
someMethod: function() {}
};
但是,具有 getSingleton
函数的模式确实有一个优点:对象仅在(第一次)调用函数时构造,而不是在实际需要对象之前构造。根据对象的复杂性,这可以改善程序的内存使用和启动时间。它基本上是延迟加载模块。
下面是一个非常流行的 JavaScript 单例模式实现示例:
var mySingleton = (function() {
var instance;
function init() {
function privateMethod() {
console.log("I am private");
}
var privateVariable = "Im also private";
var privateRandomNumber = Math.random();
return {
publicMethod: function() {
console.log("The public can see me!");
},
publicProperty: "I am also public",
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
我已经考虑了一段时间,当我们可以用这个简单的代码实现相同的结果时,我并没有真正理解这种复杂性的必要性:
singleton = (function() {
var obj = {
someMethod: function() {}
}
return obj;
}());
我是不是忽略了什么?
是的,在大多数情况下您不需要这种复杂性,只需要做
var singleton = {
someMethod: function() {}
};
但是,具有 getSingleton
函数的模式确实有一个优点:对象仅在(第一次)调用函数时构造,而不是在实际需要对象之前构造。根据对象的复杂性,这可以改善程序的内存使用和启动时间。它基本上是延迟加载模块。