单例模式用于创建某一“类”的唯一实例。
举个例子,某个页面多处需要使用公用一个弹窗,我们把弹窗当做一个类,但是并不需要每次都new一个出来(虽然这么做也可以,但是浪费资源),这种情况使用单例模式尤其合适。
// 弹窗的构造函数
var Dialog = function(options) {}
// 获取唯一实例的包装类
var OnlyDialog = (function () {
var instance
return function (options) {
if (!instance) {
instance = new Dialog(options)
}
return instance
}
})()
var a = new OnlyDialog()
var b = new OnlyDialog()
console.log(a === b)
// true
既然如此,可以把创建唯一实例的方法抽出来,作为一个通用的获取唯一实例的方案
var getSingle = function (fn) {
var result
return function () {
return result || (result = fn.apply(this, arguments))
}
}
var getSingleDialog = getSingle(Dialog)
var dialogA = getSingleDialog('a')
var dialogB = getSingleDialog('b')
console.log(dialogA === dialogB)
// true,第二次传入的'b'不生效