javascript观察者模式的简单实现
观察者模式
当一个对象的状态发生改变,所有依赖于它的对象都将得到通知,也叫做发布-订阅模式
基本的代码框架
1function PubSub() {2 this.handlers = {}3}4PubSub.prototype = {5 // 订阅事件6 on: function (eventType, handler) {},7 // 触发事件(发布事件)8 emit: function (eventType) {},9 // 删除订阅事件10 off: function (eventType, handler) {},11}
this.handlers保存了所有的事件名称和对应的操作
- 事件的绑定
1//订阅事件2var self = this3if (!(eventType in self.handlers)) {4 self.handlers[eventType] = []5}6self.handlers[eventType].push(handler)7return this
在绑定事件的时候先判断,当前事件名称是否已存在,如果不存在则创建事件名称的数组,再将事件加入
- 触发事件(发布事件)
1// 触发事件(发布事件)2var self = this3var handlerArgs = Array.prototype.slice.call(arguments, 1)4for (var i = 0; i < self.handlers[eventType].length; i++) {5 self.handlers[eventType][i].apply(self, handlerArgs)6}7return self
触发事件时,通过通过事件名称获取绑定在这个事件名上的所有事件,循环调用事件
- 事件删除
1var currentEvent = this.handlers[eventType]2var len = 03if (currentEvent) {4 len = currentEvent.length5 for (var i = len - 1; i >= 0; i--) {6 if (currentEvent[i] === handler) {7 currentEvent.splice(i, 1)8 }9 }10}11return this
实例
1var pubsub = new PubSub()2var callback = function (data) {3 console.log(data)4}5//订阅事件A6pubsub7 .on('A', function (data) {8 console.log(1 + data)9 })10 .on('A', function (data) {11 console.log(2 + data)12 })13 .on('A', callback)14 .emit('A', '我是参数')15//控制台将输出16//1我是参数17//2我是参数18//我是参数
完整的代码
1function PubSub() {2 this.handlers = {}3}4PubSub.prototype = {5 // 订阅事件6 on: function (eventType, handler) {7 var self = this8 if (!(eventType in self.handlers)) {9 self.handlers[eventType] = []10 }11 self.handlers[eventType].push(handler)12 return this13 },14 // 触发事件(发布事件)15 emit: function (eventType) {16 var self = this17 var handlerArgs = Array.prototype.slice.call(arguments, 1)18 for (var i = 0; i < self.handlers[eventType].length; i++) {19 self.handlers[eventType][i].apply(self, handlerArgs)20 }21 return self22 },23 // 删除订阅事件24 off: function (eventType, handler) {25 var currentEvent = this.handlers[eventType]26 var len = 027 if (currentEvent) {28 len = currentEvent.length29 for (var i = len - 1; i >= 0; i--) {30 if (currentEvent[i] === handler) {31 currentEvent.splice(i, 1)32 }33 }34 }35 return this36 },37}3839var pubsub = new PubSub()40var callback = function (data) {41 console.log(data)42}43//订阅事件A44pubsub45 .on('A', function (data) {46 console.log(1 + data)47 })48 .on('A', function (data) {49 console.log(2 + data)50 })51 .on('A', callback)52 .emit('A', '我是参数')
暂无评论,来抢沙发吧。