《javascript设计模式与开放实践》学习(五)惰性单例模式

在JS中可以使用代理来实现单例模式。如创建唯一DIV的场景:

 var CreateDiv=function (html) {
        this.html=html;
        this.init();
    }
    CreateDiv.prototype.init=function () {
        var div=document.createElement('div');
        div.innerHTML=this.html;
        document.body.appendChild(div);
    }

    var ProxySingleCreateDiv=(function () {
        var instance;
        return function (html) {
            if(!instance){
                instance=new CreateDiv(html);
            }
            return instance;
        }
    })();

    var a=new ProxySingleCreateDiv('sven1');
    var b=new ProxySingleCreateDiv('sven2');

通过代理ProxySingleCreateDiv实现了创建唯一Div。它的好处就是创建Div的函数CreateDiv并不需要管是否曾经创建过该对象,一切业务逻辑交给代理来处理。

模拟这样的场景,如果创建Div的时候不是页面加载的时候预先创建好,而是点击某个button才进行创建

     var getSingle=function (fn) {
        var result;
        return function () {
            return result||(result=fn.apply(this,arguments));//判断result是否为空
        }
    };
    var createLoginLayer=function () {
        var div=document.createElement('div');
        div.innerHTML='我是登录浮窗';
        div.style.display='none';
        document.body.appendChild(div);
        return div;
    };

    var createSingleLoginLayer=getSingle(createLoginLayer);

    document.getElementById('loginBtn').onclick=function () {
        var loginLayer=new createSingleLoginLayer();
        loginLayer.style.display='block';
    }

这代代码最核心的就是用到了getSingle方法,里面定义的result因为在闭包中,不会被销毁。

原文地址:https://www.cnblogs.com/GallopingSnail/p/5918342.html