var event = {

        //用来存放函数
        clientList: {},

        //添加事件监听 
        listen: function(key, fn) {
            if (!this.clientList[key]) {
                this.clientList[key] = [];
            }
            this.clientList[key].push(fn);
        },

        //触发函数时,是event.trigger(key, arguments),
        //key自定义事件名,arguments参数数组;
        trigger: function() {

            //拿到key;因为参数数量不定.所以用shift拿,剩下的是fn的参数
            var key = Array.prototype.shift.call(arguments);
            var fns = this.clientList[key];

            if (!fns || fns.length === 0) {

                //没有绑定事件
                return false;
            }     

            for (var i=0; i < fns.length; i++) {

                //把fn里面的this变成了事件对象event的this,arguments是trigger(key, arguments)的arguments.
                var fn = fns[i];
                fn.apply(this, arguments);
            }
        },

        //取消事件监听
        remove: function(key, fn) {
            var fns = this.clientList[key];
            if (!fns) {
                return false;
            }
            if (!fn) {

                //没有传入对应的函数, 表示取消key对应的所有的回调
                fns && (fns.length = 0) ;
            } else {
                for (var i=0; i < fns.length; i++) {
                    var _fn = fns[i];

                    //因为任意两个对象都不相等.所以这里传入的fn,应该是和注册用的fn是同一个fn.才能取消;
                    if (_fn === fn) {
                        fns.splice(i, 1);
                    }
                }
            }
        }
    }


    event.listen("88", function(price) {
        console.log("价格=" + price);
    })

    event.listen("90", function(price) {
        console.log("价格=" + price);
    })

    setTimeout(function() {
        event.trigger("88", 19900320)
    }, 4000)

这个event是一个自定义事件对象. 可以进行自定义的事件的添加,执行, 取消.;

适用场景: 

  1. 电商网站的登录与弱登录的差别.电商网站一般都能弱登录.登录之后,需要

    1. 切换头像

    2. 显示提示消息

    3. 显示个性化商品推荐等.

此时就可以为头像对象.提示消息对象,商品推荐对象注册loginSuccess事件.等待登录成功事件的到来

//头像对象
    var head = (function() {
        event.listen("loginSucc", function(data) {
            head.reset(data)
        })
        return {
            reset: function(data) {
                //设置新头像
            }
        }
    })()

    //info
    var info = (function() {
        event.listen("loginSucc", function(data) {
            info.prompt(data)
        })
        return {
            prompt: function(data) {
                //弹出提示信息
            }
        }
    })()

    $.ajax({
        success: function(data) {
            event.trigger("loginSucc", data);
        }
    })

简单来说这种方式,提高了各个对象的内聚, 减弱了对象之间的联系.让对象能更专注与自身抽象所代表的功能.;如果将来要加一个刷新导航的功能,那么直接在导航里面添加loginSucc事件即可.不用修改别的代码

提高了代码的可扩展性;

posted on 2018-01-13 22:35  下辈子当座桥-李飞  阅读(97)  评论(0编辑  收藏  举报