前端学习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;代理模式常用于懒加载、防抖等功能控制。这些设计模式能有效提升代码的复用性、可维护性和扩展性,是我在实际项目中非常重视的结构化思维方式。

全部评论

相关推荐

ps:我承认数电老师质疑我的时候我慌了(╥╯﹏╰╥)ง起因是数电课需要做实验每节课交实验报告给他看,但是他会提问而且这个老师很有压迫感,于是代课们都被击败了(⋟﹏⋞),所以我决定最后一节课把前面的实验报告一起交上去给他,让代课签到就好。然后还是出意外了,我本来昨天打算请带薪短假回去上最后一节实验课交实验报告,但是我忘记了,没错我忘记了!(╥╯﹏╰╥)ง,我想起来的时候时间快不够了骑着25码的哈啰狂飙回学校,果然还是没赶上,于是我去跟老师说我上厕所了,这时候就不对劲了,我复现一下场景:老师:刚刚点名怎么不在我:老师我刚刚上厕所去了,刚刚来(沉默……翻看考勤表)老师:你上节课也没来吧?(!!!)我:上节课我点名的时候我在上厕所。(我自己都不相信)!细思极恐,我一个学期都没来都是代课,我还没说名字他怎么就翻到我名字那里去了!坏了!要遭老师:呵(一种无法言说的语气)原本以为这个事情就告一段落了,下课前我跟着大家一起去登记实验报告,到我的时候我拿着三份实验报告给她……老师:(……沉默看了我的实验报告一眼,又撇了我一眼)(急!)我:老师这是我这次的数据还有上次的两个实验的也在。(害怕(&nbsp;๑ŏ&nbsp;﹏&nbsp;ŏ๑&nbsp;),低头)老师:别人一节课一个实验都做不完,你一次做三个挺厉害你(质疑,哦不是质问,汗流浃背了已经)我:我看着别人做的,我……我不知道。(主播不语,这是一味地把实验报告往老师那递,低头)(沉默……翻登记表)老师:你叫什么名字(!怎么又忘记了)我:jtd&nbsp;。(害怕)(又瞥了我一眼)老师:你是jtd?(质问!)难怪(叽里咕噜我也没看见他到底最后给我登记没,直接溜了)昨天下课后我一直在想,结合之前被举报过,我感觉他是发现我请代课了也可能是怀疑,但是她也没管,好奇怪,所以我现在也不知道他到底发现没有,看起来发现了但是懒得理我的概率更大。好累,这堆屁事,同学里面也听到一些风言风语,说起来是不在意,但是实际上这种误会我多多少少还是在意(╥╯﹏╰╥)ง&nbsp;&nbsp;&nbsp;飞升和他的女朋友日记(*&nbsp;⁰̷̴͈꒨⁰̷̴͈)=͟͟͞͞➳❤放假女朋友也要留校兼职,又可以一起去图书馆学习啦ヾ(✿゚▽゚)ノ
我还是走开发吧:你女朋友是我在牛客上见过最美的女孩
点赞 评论 收藏
分享
耐面王来了,从三月下旬到现在陆陆续续面了大概20多场海康威视(处女面)被秒了,问什么都说不出来,还是电话面快看漫画,八股盛宴,但当时八股准备的不全面,一面挂锐明科技,挂美团一面,挂腾讯一面,挂科大讯飞,挂美团一面,挂b站一面,过b站二面,挂滴滴一面,过滴滴二面,挂腾讯一面小红书一面还有一些其他的中小场,最后拿了绿盟的offer,感觉运气还是占一定比例的,比如这个岗极缺人可能问的就简单,或者本来两面的流程就一面,还有面试官的占比也很大,有的面试官一开口我就知道没戏,有的面试官就聊的很好(虽然挂了),但体验还是很好的,有的面试官八股机器疯细节狂魔,八股拷打的极其深入细节(我觉得我b站和小红书就败在了css,这里提一个经典的css问题,margin,padding的百分比是相对于谁的),一旦你这些基础问题没回答上来面试官对你印象肯定不怎么样了。还有一直深挖项目的,一定要对自己的项目熟悉啊。总结下来还是自己的不足,八股理解的不够深,没有实际实现过,项目经不起深挖,只能描述自己做了什么,怎么做的,一旦被深入拷打完全想不到其他的解决方法,算法手撕我面试下来感觉还是js的手撕占比比较大。自己三月下旬才匆匆写完了项目,八股算法都没准备,能有现在的结果已经很满意了,祝大家好运,秋招再见!
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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