js实现观察者模式
2016-06-20 12:50
465 查看
var publisher = { subscribers: { any: [] // event type: subscribers }, subscribe: function (fn, type) { type = type || 'any'; if (typeof this.subscribers[type] === "undefined") { this.subscribers[type] = []; } this.subscribers[type].push(fn); }, unsubscribe: function (fn, type) { this.visitSubscribers('unsubscribe', fn, type); }, publish: function (publication, type) { this.visitSubscribers('publish', publication, type); }, visitSubscribers: function (action, arg, type) { var pubtype = type || 'any', subscribers = this.subscribers[pubtype], i, max = subscribers.length; for (i = 0; i < max; i += 1) { if (action === 'publish') { subscribers[i](arg); } else { if (subscribers[i] === arg) { subscribers.splice(i, 1); } } } } }; function makePublisher(o) { var i; for (i in publisher) { if (publisher.hasOwnProperty(i) && typeof publisher[i] === "function") { o[i] = publisher[i]; } } o.subscribers = {any: []}; } var paper = { daily: function () { this.publish("big news today"); }, monthly: function () { this.publish("interesting analysis", "monthly"); } }; makePublisher(paper); var joe = { drinkCoffee: function (paper) { console.log('Just read ' + paper); }, sundayPreNap: function (monthly) { console.log('About to fall asleep reading this ' + monthly); } }; paper.subscribe(joe.drinkCoffee); paper.subscribe(joe.sundayPreNap, 'monthly'); paper.daily(); paper.daily(); paper.daily(); paper.monthly();
相关文章推荐
- ArcGIS JS 学习笔记4 实现地图联动
- 第三章 --- 关于Javascript 设计模式 之 代理模式
- JS 防止表单重复提交
- javascript的同源策略
- JavaScript arguments对象
- JS优秀插件收集
- REST Datasnap服务端与javascript客户端实现
- JS采用绝对定位实现回到顶部效果完整实例
- 浅谈javascript的Array.prototype.slice.call
- 基于Turn.js 实现翻书效果实例解析
- <script type="text/javascript">alert("hello world");</script>
- js 获取经纬度的实现方法
- jstl页面学习之fn标签
- JS作为值的函数用法示例
- 设置下拉列表框的javascript方式进行实现
- ajax页面局部刷新
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
- AJAX跨域请求-JSONP获取JSON数据
- JS事件添加和移出的兼容写法示例
- Javascript操作表单实例讲解(下)