6 观察者模式off方法

在这里插入图片描述

二.观察者模式off方法

<script>
    // 观察者模式的off方法
    //   在已经添加到消息盒子中的类型以及方法中,删除方法
    //   如果有这个类型,有这个方法,再执行删除操作,如果没有,不做任何操作

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

        emit(){}

        off(type,fun){
            // 如果类型方法存在,再执行删除方法,如果类型方法不存在,不执行任何操作
            
            // 如果类型不存在
            if( this.msg[type] === undefined ){
                // 执行return,终止程序执行,不做任何操作
                return;
            }

            // 从类型中,查找函数方法,从数组中删除
            this.msg[type].forEach((item,key)=>{
                // 存储的函数,与输入的要删除的函数相同
                if(item === fun){
                    // 从当前单元的索引开始,删除一个单元
                    this.msg[type].splice(key , 1);
                    
                    // 防止数组坍塌
                    // 数组只要做删除操作,就要有i--
                    // i--;
                    // 如果是for循环,就要写i--
                }
            })

        }
    }


    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);

    // 删除事件

    observer.off('没收手机' , mo1);
    observer.off('没收手机' , mo2);


    console.log(observer);


    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 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、付费专栏及课程。

余额充值