<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
觀察者模式 也稱釋出-訂閱模式 、 模型-檢視模式 。當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知依賴它的物件。觀察者模式屬於行為型模式。
觀察者模式: 類似我們在微信平臺訂閱了公眾號 , 當它有新的文章發表後,就會推播給我們所有訂閱的人。
我們作為訂閱者不必每次都去檢視這個公眾號有沒有新文章釋出,公眾號作為釋出者會在合適時間通知我們。
我們與公眾號之間不再強耦合在一起。公眾號不關心誰訂閱了它, 不管你是男是女還是寵物狗,它只需要定時向所有訂閱者釋出訊息即可。
優點:
缺點:
var Event = (function() { let list = {}; let listen = function(key, fn) { (list[key] || (list[key] = [])).push(fn); }; let remove = function(key, fn) { let fns = list[key]; if (!fns) return; if (!fn) { fns && (fns.length = 0); } else { for (let i = fns.length - 1; i >= 0; i--) { fns[i] === fn && (fns.splice(i, 1)); } } }; let trigger = function() { let keys = [].shift.call(arguments); let fns = list[keys]; if (!fns || fns.length === 0) return; for (let i = 0, fn; fn = fns[i++];) { fn.apply(this, arguments); } }; return { listen, remove, trigger }; })(); // 使用 function log(name) { console.log(name) } Event.listen('to-do', log) // 訂閱事件 Event.trigger('to-do', '111') // 111 Event.trigger('to-do', '222') // 222 Event.remove('to-do', log) // 移除事件 Event.trigger('to-do', '333') // 不執行
function EventEmitter() { this._maxListeners = 10; this._events = Object.create(null); } // 向事件佇列新增事件 // prepend為true表示向事件佇列頭部新增事件 EventEmitter.prototype.addListener = function (type, listener, prepend) { if (!this._events) { this._events = Object.create(null); } if (this._events[type]) { if (prepend) { this._events[type].unshift(listener); } else { this._events[type].push(listener); } } else { this._events[type] = [listener]; } }; // 移除某個事件 EventEmitter.prototype.removeListener = function (type, listener) { if (Array.isArray(this._events[type])) { if (!listener) { delete this._events[type] } else { this._events[type] = this._events[type].filter(e => e !== listener && e.origin !== listener) } } }; // 向事件佇列新增事件,只執行一次 EventEmitter.prototype.once = function (type, listener) { const only = (...args) => { listener.apply(this, args); this.removeListener(type, listener); } only.origin = listener; this.addListener(type, only); }; // 執行某類事件 EventEmitter.prototype.emit = function (type, ...args) { if (Array.isArray(this._events[type])) { this._events[type].forEach(fn => { fn.apply(this, args); }); } }; // 設定最大事件監聽個數 EventEmitter.prototype.setMaxListeners = function (count) { this.maxListeners = count; }; // 使用 var emitter = new EventEmitter(); var onceListener = function (args) { console.log('我只能被執行一次', args, this); } var listener = function (args) { console.log('我是一個listener', args, this); } emitter.once('click', onceListener); emitter.addListener('click', listener); emitter.emit('click', '引數'); emitter.emit('click'); emitter.removeListener('click', listener); emitter.emit('click');
Event
構造器// 建立 var customEvent = new Event('custom-event'); // 監聽 window.addEventListener('custom-event', function(e) { // do something ... console.log(`事件物件:`, e) }) // 觸發 window.dispatchEvent(customEvent)
CustomEvent
構造器,可傳遞引數。// 建立 var customEvent = new CustomEvent('custom-event', { data: { name: 'Tom', age: 18, other: 'otherMessage', } }); // 監聽 var eBox = document.getElementById('box') eBox.addEventListener('custom-event', function(e) { // do something ... console.log(`傳入的資料:`, e.data) }) // 觸發 相容寫法 if(window.dispatchEvent) { eBox.dispatchEvent(customEvent); } else { // IE8 eBox.fireEvent(customEvent); }
以上就是JS中自定義事件與觀察者模式詳解的詳細內容,更多關於JS自定義事件觀察者模式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45