var dispCbs = []; var dispIns = []; function Dispatcher(){ dispIns.push(this); dispCbs.push({}); } Dispatcher.prototype = { on(type, cb){ let cbtypes = dispCbs[dispIns.indexOf(this)]; let cbs = cbtypes[type] = (cbtypes[type] || []); if(!~cbs.indexOf(cb)){ cbs.push(cb); } }, off(type, cb){ let cbtypes = dispCbs[dispIns.indexOf(this)]; let cbs = cbtypes[type] = (cbtypes[type] || []); let curTypeCbIdx = cbs.indexOf(cb); if(~curTypeCbIdx){ cbs.splice(curTypeCbIdx, 1); } }, fire(type, ...args){ let cbtypes = dispCbs[dispIns.indexOf(this)]; let cbs = cbtypes[type] = (cbtypes[type] || []); for(let i = 0; i < cbs.length; i++){ cbs[i].apply(null, args); } } }; module.exports = Dispatcher;