前端学习28 相关面试题2

1. 前端设计模式

设计模式的目的就是编写更好 高内聚、低耦合、可维护的代码,下面是我的前端中常见的设计模式和相应的场景。

  • 单例模式:单例模式是一种只允许创建一个实例的模式。在前端中常用于创建全局唯一的对象,例如全局的状态管理器(vuex)、日志记录器等,避免了重复创建和资源浪费的问题。
class Store {
  constructor() {
    if (Store.instance) return Store.instance;
    this.data = {};
    Store.instance = this;
  }
}

  • 工厂模式:工厂模式是一种根据参数不同创建不同对象的模式,工厂模式是前端中组件封装、业务分发、请求构建等常见场景中构造对象,通过统一入口控制实例的创建,提升了代码的扩展性和可维护性。
function ComponentFactory(type) {
  if (type === 'button') {
    return new ButtonComponent();
  } else if (type === 'input') {
    return new InputComponent();
  } else {
    throw new Error('Unknown type');
  }
}
//实际应用 API请求封装
function createAPI(type) {
  const base = 'https://api.example.com/';
  switch (type) {
    case 'user':
      return (endpoint) => fetch(base + 'user/' + endpoint);
    case 'admin':
      return (endpoint) => fetch(base + 'admin/' + endpoint);
    default:
      throw 'Unknown API type';
  }
}

const userAPI = createAPI('user');
userAPI('profile'); // => fetch('https://api.example.com/user/profile')

//vue动态组件
<component :is="currentType" />
  
const components = {
  'text': TextEditor,
  'img': ImageUploader,
  'table': TableEditor,
};

const getComponent = (type) => components[type] || DefaultComp;

  • 观察者模式:观察者模式是一种对象间的一对多的依赖关系,当一个对象状态改变时,所有依赖他的对象都会自动更新。Vue 响应式系统、事件监听都是一种观察者模式。
// 简化观察者模式
class Observer {
  constructor() {
    this.subs = [];
  }
  subscribe(fn) { this.subs.push(fn); }
  notify(data) { this.subs.forEach(fn => fn(data)); }
}

  • 发布订阅模式:发布订阅模式允许一个对象(发布者或者称为主题)发布事件,而其他对象(订阅者或者称为观察者)订阅这些事件。前端中eventBus、组件通信属于发布订阅模式。
class EventBus {
  constructor() {
    this.events = {};
  }

  // 订阅
  on(eventName, callback) {
    if (!this.events[eventName]) this.events[eventName] = [];
    this.events[eventName].push(callback);
  }

  // 发布
  emit(eventName, ...args) {
    if (this.events[eventName]) {
      this.events[eventName].forEach(cb => cb(...args));
    }
  }

  // 取消订阅
  off(eventName, callback) {
    if (!this.events[eventName]) return;
    this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);
  }

  // 只执行一次
  once(eventName, callback) {
    const wrapper = (...args) => {
      callback(...args);
      this.off(eventName, wrapper);
    };
    this.on(eventName, wrapper);
  }
}

  • 代理模式:代理模式是一种通过一个代理对象控制对目标对象的访问的模式,懒加载、防抖节流、图片预加载属于代理模式。

注意发布-订阅模式属于观察者模式的一种变体,但两者存在一些本质区别。

发布订阅模式:间接通信(通过事件中心)、高解耦(发布者和订阅者互不知道)、场景(事件总线、消息队列)。

观察者模式: 直接通信(目标对象通知观察者)、低解耦(观察者知道被观察对象)、场景(DOM监听、vue2的数据绑定)。

总结:在前端开发中,常见的设计模式包括单例模式、工厂模式、观察者模式、发布订阅模式和代理模式。单例模式用于全局状态管理等只需一个实例的场景;工厂模式用于根据参数动态创建对象,常见于组件生成或接口封装;观察者模式体现为一对多依赖关系,如 Vue2 的响应式系统;发布订阅模式则通过事件中心实现解耦通信,典型如 EventBus;代理模式常用于懒加载、防抖等功能控制。这些设计模式能有效提升代码的复用性、可维护性和扩展性,是我在实际项目中非常重视的结构化思维方式。

全部评论

相关推荐

今天 12:43
已编辑
湘潭大学 Web前端
老板问:&nbsp;什么时候能去实习(我说老板那边急吗,老板说招实习生主要是来帮忙的,有的实习生会毁offer,而且招够人了就不会再招了,被鸽了再处理就会很麻烦,所以希望尽早入职)来来回回有车费报销吗(有的)薪资多少在学校做的项目(我提了改进点,说到了storybook,老板说storybook在展示方面很好)CI&nbsp;/&nbsp;CD用了什么工具为什么学前端你的优缺点看到你有全栈经历,以后的职业规划(这次记得说留下来转正了)?打算做全栈吗?这里和老板聊的还挺开心的,直到他把技术人员叫来😭看了github,老板叫了前端技术人员过来技术人员声音断断续续的,问题基本没听清1、介绍项目结构、项目亮点、遇到的难点。我感觉我的项目很拉胯,讲的时候只讲了结构,也支支吾吾的2、&nbsp;老板问:你觉得哪些组件比较难呢?难在什么地方?我:upload和tree比较难,upload主要是在处理生命周期麻烦点,tree主要是嵌套太深了。也是支支吾吾的(太久了真记不清了)。3、技术人员问:为什么学前端(为什么这个问题在每次面试里都要问两三遍啊😭)、怎么学前端的(我说文档、视频)4、技术人员问:你提到了MDN,你在MDN里印象最深的是什么,特别是CSS方面?我:(完蛋了,MDN我一般是学深入一点的东西,平时是看W3School的)支支吾吾的说了影子dom,fetch&nbsp;api,mutation&nbsp;observer之类的(CSS方面在MDN看的实在不多,于是开始扯别的),但我知道一点视觉格式化模型5、技术人员问:那你能说说BFC吗我:先说了它是什么、用途是什么,然后卡住了,问能不能看笔记,技术人员同意了讲完之后,两边沉默了很久6、技术人员问:那你有研究过百分比吗?百分比是基于什么的?这一方面MDN有详细解释我:(我平时做项目都没有仔细思考过百分比是基于谁的,都是直接看的结果)我说我一般在padding、margin、position做响应式的时候会用,但没有想过是基于谁的,后续我会去看的。7、技术人员问:如果二次封装element-plus组件,我该如何……(这里断断续续的,根本没听懂在讲什么😭,好像是传递props和导出方法的问题)我:听不懂×3,而且我没封过element-plus8、技术人员:如果我有的props不想用,我还是要一个一个传吗?(这里真的没听懂在问什么……)了解过透传吗?我:(开始鬼扯)了解过,可以用useAttributes还是什么api可以接收,模板里可以直接用$attr接收。如果不想传props,可以用provide和inject直接把上下文注入进去9、技术人员:你没有了解过×××吗?(这里似乎是一个技术工具,但没有听清他说的到底是什么)我不知道啊!😭我只想着要不别问了,技术人员说一个技术栈都是我没听过的10、技术人员:你学过node.js吗我:只学了文件操作和express框架,平时用来写接口技术人员:用node写过中间件吗?像×××这种的(这里也是一个工具名,听不清)我:没有11、技术人员:学过TS吗?用的多吗?我:没有系统学过,但是会用,两个项目都是TS写的,元组、泛型之类的12、技术人员:知道类型体操吗,像一些工具比如×××(还是一个工具,没听懂)我:知道一点,可以用来写泛型工具13、技术人员:你知道哪些TS泛型工具?写过哪些?我:(记不清了,直接调笔记出来了),把用过的泛型工具说了,还给他看了项目里的泛型工具,但都写的非常简单两边又沉默了一会13、技术人员问:如果设计一个table组件你要怎么考虑……我:听不清……技术人员重复两次,老板:设计一个表单组件,你可以考虑需要传什么props类型、导出什么方法……(给了很多提示)我这时候已经想跑了,只说了大概,短短几句话,因为我自己的form组件没有传递太多参数,只有三个props和一个方法……14、技术人员:现在有一个列表,点进去可以查看商品详情,(后面的话不记得了,当时楼梯间很吵,声音也听不清)我:没听清×215、技术人员:如果网络突然断开,但用户继续下滑还是能获取数据,这种怎么做?(这时候感觉他语气有点急了)我:缓存吗?worker&nbsp;server?技术人员:除了缓存呢?给出具体的方案。预连接什么的我:我不是很了解……技术人员:我问的差不多了老板:好的,还有什么要问的吗?我:没有了老板:我们争取今天给你一个答复,先拜拜我:拜拜这是一次绝对惨败の面试……不打算投递了,基础知识都没打好,一问就暴露原型……八股更是背不出,一看见八股就想睡觉😭室友安慰我说我已经很棒了,更难过了😭下午两点,老板说我对前端有兴趣,基础不错满足要求,想再沟通一下。老板说我基础不错?不是哥们😭下午四点,技术人员说把简历发到总部了,节后再回复6月3日下午,发了offer,看来他们公司真的很缺人(但是公司很小,而且看起来像外包,不知道要不要去……7月1日编:感觉还好(现在不觉得了),公司有完整的开发流程,还会讨论技术方案,氛围松弛但我项目都跑不起来……好挫败……但是大致流程能看懂好像不是外包,虽然还是不知道是做什么的7月11日编:天天加班,需求不明确,一切都乱七八糟的,一个下午要来两次看你在干嘛,就要给你加活。还要跨组写文档,还骗我说是给客户看的。还说要主动要活,这样才学的快、业务不重要巴拉巴拉……当然也有我能力不行的原因。但为什么要把不是我的活分给我?而且还是下午临时分的,我都说不想干了,还有培训文档也是实习生写,我请问呢?7月14日编:今天加班到八点……想辞职的心达到了目前的顶峰。以后要把杂活安给我了,理由是“做的多学的多”,“他们太忙了可以分一点出来”,加班只加半小时还被说闲了,要给我多分配任务。啊可恶。7月17日编:今天帮组长导出物料,比改bug好玩,但我感觉有的地方有问题,因为它不能输入改bug要找测试,测试叫我找后端,后端叫我找负责人……好好好,至少敢和别人说话了
阿尔伯克基炸鸡分销商:没事没事已经发挥的很好了,大不了就当成一次积累面试经验,继续海投一定还能约面的
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务