单例模式用于创建某一“类”的唯一实例。

    举个例子,某个页面多处需要使用公用一个弹窗,我们把弹窗当做一个类,但是并不需要每次都new一个出来(虽然这么做也可以,但是浪费资源),这种情况使用单例模式尤其合适。

    1. // 弹窗的构造函数
    2. var Dialog = function(options) {}
    3. // 获取唯一实例的包装类
    4. var OnlyDialog = (function () {
    5. var instance
    6. return function (options) {
    7. if (!instance) {
    8. instance = new Dialog(options)
    9. }
    10. return instance
    11. }
    12. })()
    13. var a = new OnlyDialog()
    14. var b = new OnlyDialog()
    15. console.log(a === b)
    16. // true

    既然如此,可以把创建唯一实例的方法抽出来,作为一个通用的获取唯一实例的方案

    1. var getSingle = function (fn) {
    2. var result
    3. return function () {
    4. return result || (result = fn.apply(this, arguments))
    5. }
    6. }
    7. var getSingleDialog = getSingle(Dialog)
    8. var dialogA = getSingleDialog('a')
    9. var dialogB = getSingleDialog('b')
    10. console.log(dialogA === dialogB)
    11. // true,第二次传入的'b'不生效