最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • (设计模式)2.单例模式

    正文概述 掘金(国服前端)   2021-02-19   606

    说明:每天一个设计模式,成功奖励自己买个小册学习o(╥﹏╥)o
    PS:学习自---掘金的JavaScript 设计模式核⼼原理与应⽤实践小册

    1.概念

    保证一个类仅有一个实例,并提供一个访问它的全局访问点

    2.代码案例
    • a.通过类定义方式实现
    /**
     * 游戏说明:
     * 1.当我们玩王者荣耀的时候,都会有一个游戏金币。
     * 2.当我们进入游戏不同页面的时候我们都能够获得这个游戏金币,而不是重新请求获得
     * 3.哈哈哈强制和vuex中概念类似
     * 
    */
    class Game {
        enter() {
            console.log('进入游戏画面');
        }
        // 静态方法获取对象
        static getGame() {
            // 判断是否创建实例了
            if(!Game.obj) {
                Game.obj = new Game()
            }
            return Game.obj;
        }
    }
    // 获取的对象都是同一个的对象
    const game1 = Game.getGame();
    const game2 = Game.getGame();
    const game3 = Game.getGame();
    console.log(game1 === game2); // true
    console.log(game2 === game3); // true
    
    • b.通过闭包的方式实现
    function Game() {
    }
    Game.getGame = (function(){
        let obj = null;
        return function(){
            if(!obj){
                obj = new Game()
            }
            return obj;
        }
    })();
    const game1 = Game.getGame();
    const game2 = Game.getGame();
    
    console.log(game1 === game2); // true
    
    3.面试题
    • a.实现一个Storage

    1).静态方法实现
    PS:案例需要结合html页面实现

    /**
     * 说明:
     * 1.首先创建保证只有一个实例的对象
     * 2.通过这个对象set和get值,结合localStorage
     */
    class Storage {
        static getInstance() {
            if(!Storage.instance){
                Storage.instance = new Storage()
            }
            return Storage.instance
        }
        // 设置值
        setItem(key, value) {
            return localStorage.setItem(key, value)
        }
        // 获取值
        getItem(key) {
            return localStorage.getItem(key)
        }
    }
    const storage1 = Storage.getInstance();
    const storage2 = Storage.getInstance();
    storage1.setItem('age', 12);
    console.log(storage2.getItem('age'))  // 12
    console.log(storage2.getItem('age'))  // 12
    storage2.setItem('age', 13);
    console.log(storage1.getItem('age'))  // 13
    

    2).闭包版

    function StorageBase () {
    }
    StorageBase.prototype.getItem = function (key){
        return localStorage.getItem(key)
    }
    StorageBase.prototype.setItem = function (key, value){
        return localStorage.setItem(key, value)
    }
    
    const Storage = (function(){
        let instance = null;
        return function(){
            if(!Storage.instance) {
                instance = new StorageBase();
            }
            return instance;
        }
    })()
    
    const storage1 = new Storage();
    const storage2 = new Storage();
    storage1.setItem('age', 12);
    console.log(storage2.getItem('age'))  // 12
    console.log(storage2.getItem('age'))  // 12
    storage2.setItem('age', 13);
    console.log(storage1.getItem('age'))  // 13
    

    (设计模式)2.单例模式

    • b.实现一个全局的模态框

    1).静态方法实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>单例模式弹框</title>
        <style>
            #modal {
                height: 200px;
                width: 200px;
                line-height: 200px;
                position: fixed;
                left: 50%;
                top: 50%;
                transform: translate(-50%, -50%);
                border: 1px solid black;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <button id="open">打开弹窗</button>
        <button id="close">关闭弹窗</button>
        <script>
            class Modal {
                static getModal() {
                    if(!Modal.modal) {
                        Modal.modal = document.createElement('div');
                        Modal.modal.innerHTML = '我是一个全局唯一的Modal'
                        Modal.modal.id = 'modal'
                        Modal.modal.style.display = 'none'
                        document.body.appendChild(Modal.modal)
    
                    }
                    return Modal.modal;
                }
            }
            document.getElementById('open').addEventListener('click', function() {
                const modal = Modal.getModal();
        	    modal.style.display = 'block'
            })
            document.getElementById('close').addEventListener('click', function() {
                const modal = Modal.getModal();
                if(modal) {
                    modal.style.display = 'none'
                }
            })
        </script>
    </body>
    </html>
    

    2).闭包实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>单例模式弹框</title>
        <style>
            #modal {
                height: 200px;
                width: 200px;
                line-height: 200px;
                position: fixed;
                left: 50%;
                top: 50%;
                transform: translate(-50%, -50%);
                border: 1px solid black;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <button id="open">打开弹窗</button>
        <button id="close">关闭弹窗</button>
        <script>
            const Modal = (function(){
                let modal = null;
                return function() {
                    if(!modal) {
                        modal = document.createElement('div')
                        modal.innerHTML = '我是一个全局唯一的Modal'
                        modal.id = 'modal'
                        modal.style.display = 'none'
                        document.body.appendChild(modal)
                    }
                    return modal;
                }
            })()
            document.getElementById('open').addEventListener('click', function() {
                const modal = new Modal();
        	    modal.style.display = 'block'
            })
            document.getElementById('close').addEventListener('click', function() {
                const modal = new Modal();
                if(modal) {
                    modal.style.display = 'none'
                }
            })
        </script>
    </body>
    </html>
    

    起源地下载网 » (设计模式)2.单例模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元