obj[i] = event[i];
}
};
let houseObj = {}; //发布者对象
initEvent(houseObj); //为对象添加发布-订阅功能
//小明订阅的消息
houseObj.listen(‘big’,function(size){
console.log(‘小明:我要的房子是’+size+‘平米’);
})
//小绿订阅的消息
houseObj.listen(‘small’,function(size){
console.log(‘小绿:我要的房子是’+size+‘平米’);
})
houseObj.trigger(‘big’,100);
houseObj.trigger(‘small’,150);
如上,我们只需要调用initEvent,便可以使所有对象都拥有发布订阅模式。
那么,接下来,如果某用户不想订阅了
如何取消订阅?
//删除订阅
event.remove = function(key,fn){
let fns = this.list[key];
//如果没有定阅过 直接返回false
if(!fns){
return false;
}
// 如果没有传入具体的回调函数,表示需要取消key对应消息的所有订阅
if(!fn){
fn && (fns.length = 0);
}else{
for(let i = fns.length - 1;i >= 0; i-- ){
let _fn = fns[i];
_fn === fn && (fns.splice(i,1)); //删除订阅者对应的回调函数
}
}
}
//其余保持不变
//小明订阅的第一条消息
houseObj.listen(‘big’,fn1 = function(size){
console.log(‘小明:我要的第一套房子是’+size+‘平米’);
})
//小明订阅的第二条消息
houseObj.listen(‘big’,fn2 = function(size){
console.log(‘小明:我要的第二套房子是’+size+‘平米’);
})
//删除第二条
houseObj.remove(‘big’,fn2);
houseObj.trigger(‘big’,100);
这样,控制台就会只有一条打印了,只有第一条消息还在。
继续深度解耦
1.我们给每个发布者对象都添加了 listen 和 trigger 方法,以及一个缓存列表 list,这其实是一种资源浪费。
2.小明跟售楼处对象还是存在一定的耦合性,小明至少要知道售楼处对象的名字是houseObj ,要知道房型是big,还是small或是normal才能顺利的订阅到事件。
所以我们继续优化,封装一个全局发布-订阅模式对象
let Event = (function(){
let list = {},
listen,
trigger,
remove;
listen = function(key,fn){
(list[key] || (list[key] = [])).push(fn);
};
trigger = function(){
let key = Array.prototype.shift.call(arguments),
// 取出该消息对应的回调函数的集合
fns = list[key];
if(!fns || fns.length === 0){
return false;
}
for(let i = 0,fn; fn = fns[i++]😉{
fn.apply(this,arguments); // arguments 是发布消息时附送的参数
}
};
remove = function(key,fn){
let fns = list[key];
//如果没有定阅过 直接返回false
if(!fns){
return false;
}
// 如果没有传入具体的回调函数,表示需要取消key对应消息的所有订阅
// 小明在售楼处不买了 取消了 说要买三室一厅,四室一厅,结果都是吹牛皮
if(!fn){
fn && (fns.length = 0);
}else{
for(let i = fns.length - 1;i >= 0; i-- ){
let _fn = fns[i];
_fn === fn && (fns.splice(i,1)); //删除订阅者对应的回调函数
}
}
};
return {
listen:listen,
trigger:trigger,
remove:remove
}
})();
Event.listen(‘big’,function(size){
console.log(‘小明想要的房型大小是’+size+‘平米’);
})
Event.trigger(‘big’,100);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024c 备注前端获取(资料价值较高,非无偿)
最后
编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。