javascript观察者模式

javascript观察者模式

观察者模式:当一个对象的状态发生改变,所有依赖于它的对象都将得到通知

通用发布订阅

var event = {
    clientList:[],
    listen: function (key, fn) {
        if(!this.clientList[key]){
            this.clientList[key] = [];
        }
        this.clientList[key].push(fn);
    },
    trigger: function () {
        var key = Array.prototype.shift.call(arguments);        //第一个参数是订阅的方法,后面为调用函数时的参数
        fns = this.clientList[key];

        if(!fns || fns.length === 0){                           //没有绑定的订阅函数
            return false;
        }

        for (var i = 0, fn; fn = fns[i++];){                    //传递的绑定方法可能是多个的以数组传递的
            fn.apply(this, arguments);
        }
    }
};


var installEvent = function (obj) {                             //给对象上绑定订阅模式
    for (var i in event){
        console.log(i);
        obj[i] = event[ i ];
    }
};


var salesOffices = {};
installEvent(salesOffices);     //安装订阅模式

salesOffices.listen('squareMeter88', function (price) {
    console.log('价格='+price);
});
salesOffices.listen('squareMeter100', function (price) {
    console.log('价格='+price);
});

salesOffices.trigger('squareMeter88', 2000000);
salesOffices.trigger('squareMeter100', 3000000);

使用一个中间对象

使用中间对象,使事件触发和事件监听剥离

var Event = (function () {
    var clientList = {},
            listen,
            trigger,
            remove;

    listen = function (key, fn) {
        if(!clientList[key]){
            clientList[key] = [];
        }
        clientList[key].push(fn);
    };

    trigger = function () {
        var key = Array.prototype.shift.call(arguments);
        fns = clientList[key];
        if(!fns || fns.length === 0){
            return false;
        }

        for(var i = 0, fn; fn=fns[i++];){
            fn.apply(this, arguments);
        }
    };

    remove = function (key, fn) {
        var fns = clientList[key];
        if(!fns){
            return false;
        }

        if(!fn){                    //表明要清空
            fns && (fns.length = 0)
        } else {
            for(var l = fns.length-1; l >= 0; l--){
                var _fn = fns[l];
                if(_fn === fn){
                    fns.split(l, 1);
                }
            }
        }
    };

    return{
        listen: listen,
        trigger: trigger,
        remove: remove
    }
})();

Event.listen('squareMeter88', function (price) {
    console.log('价格=' + price);
});

Event.trigger('squareMeter88', 2000000);

使用,模块间通信

<body>
    <button id="count">点击</button>
    <div id="show"></div>
</body>
<script>
    var a = (function () {
        var count = 0;
        var button = document.getElementById('count');
        button.onclick = function () {
            Event.trigger('add', count++);
        }
    })();

    var b = (function () {
        var div = document.getElementById('show');
        Event.listen('add', function (count) {
            div.innerHTML = count;
        })
    })();
</script>

按钮点击后将在div中显示点击的次数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值