zoukankan      html  css  js  c++  java
  • 《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因为在闭包中,不会被销毁。

  • 相关阅读:
    第四章作业
    第二章上机实验报告
    对二分法的理解和结对编程情况
    Mysql与sql server的列的合并
    C#中如何去除窗体默认的关闭按钮
    C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件
    running total sql 2012+
    Poqwe Pivot error
    事务
    ssis 导EXCEL ERROR
  • 原文地址:https://www.cnblogs.com/GallopingSnail/p/5918342.html
Copyright © 2011-2022 走看看