发布-订阅者模式

一、前言

学习vue的时候,对深入响应式原理模模糊糊的,现在简单一下理解。

二、简述VUE响应原理。

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,
在数据变动时发布消息给订阅者,触发相应的监听回调。

三、什么是发布-订阅者模式

简单理解:比如一个商店,会员粉丝经常要询问有什么活动,员工每次都要做一遍解答,工作重复又麻烦,但是把所有会员的邮箱收集成名单,有活动时统一发送邮件。会员就是订阅者,商店就是发布者会在合适的时候遍历名单,依次给会员发布消息。发送邮件通知就是一个的发布—订阅模式。
多个订阅者(一般是注册的函数)同时监听同一个数据对象,当这个数据对象发生变化的时候会执行一个发布事件,通过这个发布事件会通知到所有的订阅者,使它们能够自己改变对数据对象依赖的部分状态。在这里插入图片描述

四、发布订阅者模式的作用

主要为了处理一对多的场景,应用于不同情况下的不同函数的调用

优点:耦合性低,便于代码的维护
缺点:创建订阅者本身要消耗一定的时间和内存,可能订阅的消息未发生,但这个订阅者会始终存在于内存中

五、代码示例

创建发布-订阅者模式的对象
	function Event () {
   this.handlers = {};
 }
 
 Event .prototype = {
  	// 订阅事件
     on: function(eventType, handler){
         var self = this;
         if(!(eventType in self.handlers)) {
            self.handlers[eventType] = [];
         }
         self.handlers[eventType].push(handler);
         return this;
     },
      // 触发事件(发布事件)
     emit: function(eventType){
        var self = this;
        var handlerArgs = Array.prototype.slice.call(arguments,1);
        for(var i = 0; i < self.handlers[eventType].length; i++) {
          self.handlers[eventType][i].apply(self,handlerArgs);
        }
        return self;
     },
     // 删除订阅事件
     off: function(eventType, handler){
         var currentEvent = this.handlers[eventType];
         var len = 0;
         if (currentEvent) {
             len = currentEvent.length;
             for (var i = len - 1; i >= 0; i--){
                 if (currentEvent[i] === handler){
                     currentEvent.splice(i, 1);
                 }
             }
         }
         return this;
     }
 };	
  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圣京都

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值