- 购买者订阅是否有库存商品
let storeObj = {}; // 定义发布者 storeObj.list = []; // 缓存列表,存放订阅的回调函数 // 添加订阅者 storeObj.listen = function(key, fn) { // 此时this指向storeObj if(!this.list[key]){ this.list[key] = []; } this.list[key].push(fn) } // 发布消息 storeObj.trigger = function(){ // arguments为类数组 // shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值 let key = Array.prototype.shift.call(arguments) console.log(key) let fns = this.list[key] if(!fns || fns.length <= 0){ return; } for(let i = 0, fn; fn= fns[i++];){ // fn.apply(this, arguments) fn(...arguments) } } // 订阅 storeObj.listen('小明',function(size){ console.log(`您订阅的尺码:${size},有库存了`) }) storeObj.listen('小张',function(name,size){ console.log(`您订阅的尺码:${size},有库存了`) }) // 取消订阅 storeObj.remove = function(key,fn){ let fns = this.list[key]; if(!fns){ return false; } if(!fn){ fn && (fns.length = 0); }else { for(var i = fns.length-1;i>=0;i--){ var _fn = fns[i]; if(_fn == fn){ fns.splice(i,1); } } } } storeObj.trigger("小明",34) storeObj.trigger("小张",28)
- 封装
let Event = (function(){ let list = {}, listen, trigger, remove; listen = function(key, fn) { if(!list[key]){ list[key] = []; } list[key].push(fn) } trigger = function(){ let key = Array.prototype.shift.call(arguments) console.log(key) let fns = list[key] if(!fns || fns.length <= 0){ return; } for(let i = 0, fn; fn= fns[i++];){ // fn.apply(this, arguments) fn(...arguments) } } remove = function(key,fn){ let fns = list[key]; if(!fns){ return false; } if(!fn){ fn && (fns.length = 0); }else { for(var i = fns.length-1;i>=0;i--){ var _fn = fns[i]; if(_fn == fn){ fns.splice(i,1); } } } } })();
上一篇
异步函数
2021-10-18
下一篇
Vue项目中应用TypeScript
2021-10-08