zoukankan      html  css  js  c++  java
  • javascript单例模式

    单例模式:一个类只有一个实例,并提供一个访问它的全局访问点

    1.面向对象版的基于类的单例

    创建唯一的div节点

    var createDiv = (function() {
        var instance;
    
        var createDiv = function(html) {
            if (instance) return instance;
            this.html = html;
            this.init();
            return instance = this;
        };
    
        createDiv.prototype.init = function() {
            var div = document.createElement('div');
            div.innerHTML = this.html;
            document.body.appendChild(div);
        };
    
        return createDiv;
    }());
    
    var a = new createDiv('test1');
    var b = new createDiv('test2');
    
    console.log(a === b);   // true
    
    

    代理类实现单例将创建单例和管理单例分离

    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 ProxySingleton = (function(){
        var instance;
        return function(html) {
            if (!instance) {
                instance = new createDiv(html);
            }
            return instance;
        }
    }());
    
    var a = new ProxySingleton('test1');
    var b = new ProxySingleton('test2');
    
    console.log(a === b);   // true
    

    2. javascript中的单例模式

    点击登陆按钮时,创建登陆浮窗并弹出,浮窗唯一。之后再点击,操作已经存在的浮窗

    惰性单例:需要的时候才创建对象

    var createLoginLayer = (function() {
        var div;
        return function() {
            if (!div) {
                div = document.createElement('div');
                div.innerHTML = 'login';
                div.style.display = 'none';
                document.body.appendChild(div);
            }
    
            return div;
        }
    }());
    
    document.getElementById('login').onclick = function() {
        var loginLayer = createLoginLayer();
        loginLayer.style.display = 'block';
    }
    

    通用的惰性单例,将创建单例和管理单例分离

    var createLoginLayer = function() {
        div = document.createElement('div');
        div.innerHTML = 'login';
        div.style.display = 'none';
        document.body.appendChild(div);
        return div;
    }
    
    var getSingle = function(fn) {
        var result;
        return function() {
            return result || (result = fn.apply(this, arguments));
        }
    };
    
    var createSingleLoginLayer = getSingle(createLoginLayer);
    
    document.getElementById('login').onclick = function() {
        var loginLayer = createSingleLoginLayer();
        loginLayer.style.display = 'block';
    }
    
  • 相关阅读:
    JavaScript面向对象精要(一)
    触摸事件
    移动端触摸事件介绍
    总结js常用函数和常用技巧(持续更新)
    JavaScript 常用函数总结
    windows环境下安装vue+webpack的开发环境
    js面向对象,多种创建对象方法!
    javascript遍历算法与技巧
    前端工作面试问题--摘取自github
    c++刷题(27/100)反转单项链表,链表的倒数第k个
  • 原文地址:https://www.cnblogs.com/u14e/p/6723982.html
Copyright © 2011-2022 走看看