《高级前端4.2》JavaScript 设计模式之单例模式

在 JavaScript 里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。学习好单例模式,在开发中将能很好的控制命名空间,避免变量污染等。

 

单例模式概念解读

说明:

1.如果房子没有门,就找开发商造一个门;如果房子已经有门,那么就直接用这个门;

2.小王跟小李的两扇门分别归属各自的房子,只有唯一的一个门,拥有唯一的门牌号,之间又可以通信;

(各自唯一的一扇门,可以保护各自的家不被坏人侵入)

 

 

单例模式的作用和注意事项

 

 

单例模式代码实战和总结

我们以上面的例子,来展示一个简单的单例模式:

<script type="text/javascript">
//1.独立的对象 建2个 一个xiaowang 一个xiaoli
//2.让xiaoli跟xiaowang通过门铃进行通信
//3.先看一下xiaowang家有没有门 如果有门直接通过门铃通讯didi 如果没有先建门
//4.两个单利之间开始通信

//动态单例,需要的时候才会new
var xiaowang = (function(argument){
    var xiaowangjia = function(message){
        this.menling = message;
    }
    var men;
    var info = {
        sendMessage: function(message){
            if(!men){
                men = new xiaowangjia(message);
            };
            return men;
        }
    };
    return info;
})();
//静态单例,常驻内存
var xiaoli = {
    callXiaowang: function(msg){
        var _xw = xiaowang.sendMessage(msg);
        alert(_xw.menling);
        _xw = null; //等待垃圾回收,以免闭包造成内存泄漏
    }
}
xiaoli.callXiaowang("didi");
</script>

 

再来看一个例子:

<input type="button" id="a" value="buttonA">
<input type="button" id="d" value="buttonD">

<script type="text/javascript">
    //来看一个平时开发的例子,页面上有6个按钮 
    //a b c => top
    //d e f => banner
    var tops = {
        init: function(){
            this.render();
            this.bind();
        },
        a: 4,
        render: function(){    //存放所有DOM元素
            var me = this;
            me.btna = $('#a');
        },
        bind: function(){
            var me = this;
            me.btna.click(function(){
                //业务逻辑取出去
                me.test();
            });
        },
        test: function(){
            a = 5;
        }
    };
    var banner = {
        init: function(){
            this.render();
            this.bind();
        },
        a: 4,
        render: function(){
            var me = this;
            me.btna = $('#d');
        },
        bind: function(){
            var me = this;
            me.btna.click(function(){
                //业务逻辑去出去
                me.test();
            });
        },
        test: function(){
            // a = 6;
            tops.a = 6;
            console.log(tops.a);
        }
    };
    
    tops.init();
    banner.init();
    console.log(tops.a);
</script>

 

posted @ 2016-02-22 00:30  暖风叔叔  阅读(598)  评论(0编辑  收藏  举报