7 观察者模式emit方法

<script src="../02_代码/jquery.min.js"></script>
<script>
    class Observer{
        constructor(){
            this.msg={};
        }

        on(type,fun){
            if(this.msg[type]===undefined){
                this.msg[type]=[fun];
            }else{
                this.msg[type].push(fun);
            }
        }

        emit(type,...funArr){
            if(this.msg[type]===undefined){
                return;
            }
            this.msg[type].forEach(function(item){
                funArr.forEach(function(i){
                    if(item===i){
                        item();
                    }
                })
            })
        }

        off(type,fun){
            if(this.msg[type]===undefined){
                return;
            }
            this.msg[type].forEach((item,key)=>{
                if(item===fun){
                    this.msg[type].splice(key,1);
                }
            });
        }
    }

    const observer=new Observer();

    observer.on('你在干嘛',A1);
    observer.on('你在干嘛',B1);
    observer.on('你在干嘛',C1);

    observer.off('你在干嘛',A1);
    observer.emit('你在干嘛',B1,C1);

    function A1(){
        console.log('玩');
    }
    function B1(){
        console.log('跑步');
    }
    function C1(){
        console.log('走路');
    }
</script>

三.观察者模式emit方法

在这里插入图片描述

<script>
    // 观察者模式的emit方法
    // emit方法,是执行调用,已经存在与消息盒子中,类型中的函数方法
    // 也称为发布方法
    // 实现的原理和方法
    // 执行调用的方法,有可能是一个或者多个,是 不定项 执行
    // 需要使用 ...参数 并合运算符,将输入的实参 以 数组的形式存储在 参数中

    class Observer{
        constructor(){
            this.msg = {};
        }

        on(type,fun){
            if(this.msg[type] === undefined){
                this.msg[type] = [fun];
            }else{
                this.msg[type].push(fun);
            }
        }

        off(type,fun){
            if(this.msg[type] === undefined){
                return;
            }

            // for循环要防止数组坍塌  i--
            // 此时必须要写箭头函数  因为有this指向问题
            this.msg[type].forEach((item,key)=>{
                if(item === fun){
                    this.msg[type].splice(key,1);
                }
            })
        }

        // 第二个参数是 合并运算符,以数组的形式存储之后的所有的实参
        // funArr中有一个错误或者是不存在的 就报错
        emit(type , ...funArr){
            console.log(funArr);

            // 判断类型如果不存在,直接终止程序
            if(this.msg[type] === undefined){
                return;
            }

            // 如果类型存在,还要判断,函数是否存在
            // 如果存在,再来执行,函数

            // item 是 已经存储的 方法
            // 要与 在 funArr 中 输入 的数组,比较
            // 如果相同,证明消息盒子中,有这个数组,我们再执行
            // 此处可用function也可以用箭头函数
            this.msg[type].forEach(function(item){
                funArr.forEach(function(i){
                    // item 是已经存储在 消息盒子中的方法
                    // i    是通过参数,输入的需要执行的方法
                    // 要执行发布的方法,一定是已经存储在消息盒子中的方法
                    // 存储在消息盒子中的方法,也不是都发布,也要是参数中有的,要发布的方法
                    // 总之,就是消息盒子数组中存储的方法,必须与参数数组中存储的方法,对应上,才会执行发布
                    if(item === i){
                        item();
                    }
                })
            })
        }
    }

    // 创建观察者
    const observer = new Observer();
    
    // 第一次新增打电话类型,是新增类型,并且赋值一个数组,存储函数
    observer.on('打电话' , da1);
    // 打电话,类型已经存在,直接向数组中新增函数就可以了
    observer.on('打电话' , da2);

    // 写检查
    observer.on('写检查' , jian1);
    observer.on('写检查' , jian2);
    observer.on('写检查' , jian3);

    // 没收手机
    observer.on('没收手机' , mo1);
    observer.on('没收手机' , mo2);
    observer.on('没收手机' , mo3);

    console.log(observer);

    // jian1 , jian2 , jian3 以数组的形式,存储在参数2中
    observer.emit('写检查' , jian1 ,  jian5 )





    // 函数必须是提前定义好的,有函数名称,或者变量名称的,这样才能删除
    function da1(){
        console.log('请老爸,下午2点来学校');
    }

    function da2(){
        console.log('请老妈,下午3点来学校');
    }

    function jian1(){
        console.log('给班主任写1000字的检查');
    }

    function jian2(){
        console.log('给教导主任写2000字的检查');
    }

    function jian3(){
        console.log('给校长写3000字的检查');
    }

    function jian5(){
        console.log('给教育局局长写30000字的检查');
    }


    function mo1(){
        console.log('没收手机1天');
    }

    function mo2(){
        console.log('没收手机1年');
    }

    function mo3(){
        console.log('没收手机1辈子');
    }
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值