前端面试之设计模式怎么学

前端主学的还是计算机网络 然后就是设计模式
我在前端大厂校招过程的一些三面
是由部门负责人来面 但他不是前端
可能会从设计模式来考察你的编码功底(我经历过两次)
本文是对这些内容的分享 大家可以看看。

---
一、前端常用设计模式实战
1. 单例模式(Singleton)
场景:全局状态管理、浏览器环境唯一对象
示例:实现一个浏览器日志管理器
class Logger {
  constructor() {
    if (!Logger.instance) {
      this.logs = [];
      Logger.instance = this;
    }
    return Logger.instance;
  }

  log(message) {
    this.logs.push(message);
    console.log(`[LOG]: ${message}`);
  }
}

// 使用示例
const logger1 = new Logger();
const logger2 = new Logger();
console.log(logger1 === logger2); // true
框架应用:React Hooks 的 useState 内部通过单例模式管理状态队列
2. 装饰器模式(Decorator)
场景:功能扩展、高阶组件
示例:React 高阶组件增强
function withLoading(WrappedComponent) {
  return function EnhancedComponent(props) {
    const [loading, setLoading] = useState(true);
    
    useEffect(() => {
      props.fetchData().finally(() => setLoading(false));
    }, []);

    return loading ? <Spinner /> : <WrappedComponent {...props} />;
  };
}

// 使用
const EnhancedUserList = withLoading(UserList);
框架应用:Redux 的 connect 函数实现组件与 Store 的连接
3. 代理模式(Proxy)
场景:数据校验、缓存、对象访问控制
示例:API请求缓存代理
const apiService = {
  fetchData() {
    return axios.get('/api/data');
  }
};

const cachedApiProxy = new Proxy(apiService, {
  cache: new Map(),
  get(target, prop) {
    return (...args) => {
      const key = `${prop}-${JSON.stringify(args)}`;
      if (this.cache.has(key)) {
        return Promise.resolve(this.cache.get(key));
      }
      return target[prop](...args).then(res => {
        this.cache.set(key, res.data);
        return res.data;
      });
    };
  }
});

// 使用:重复调用会直接返回缓存
cachedApiProxy.fetchData().then(console.log);
框架应用:Vue3 的响应式系统基于 Proxy 实现数据劫持

---
二、发布订阅 vs 观察者模式深度解析
4. 核心差异
暂时无法在飞书文档外展示此内容
5. 代码实现对比
观察者模式:
class Subject {
  constructor() {
    this.observers = [];
  }
  addObserver(obs) {
    this.observers.push(obs);
  }
  notify(data) {
    this.observers.forEach(obs => obs.update(data));
  }
}

class Observer {
  update(data) {
    console.log('Received:', data);
  }
}
发布订阅模式:
class EventBus {
  constructor() {
    this.events = new Map();
  }
  
  on(event, callback) {
    const handlers = this.events.get(event) || [];
    handlers.push(callback);
    this.events.set(event, handlers);
  }
  
  emit(event, ...args) {
    const handlers = this.events.get(event);
    handlers?.forEach(handler => handler(...args));
  }
}
6. 实际应用场景
- 观察者模式:Vue 的 watch 实现、React Class 组件的生命周期通知
- 发布订阅:跨组件通信(Vue EventBus)、Redux 的 subscribe 机制、WebSocket 消息处理

---
三、框架源码中的设计模式实践
7. React 中的组合模式
- 组件嵌套:通过 props.children 实现容器组件与展示组件解耦
- Hooks 组合:自定义 Hook 整合多个基础 Hook 的功能
function useUser() {
  const [user, setUser] = useState(null);
  useEffect(() => { /* 获取用户数据 */ }, []);
  return user;
}

// 组合多个自定义 Hook
function useUserProfile() {
  const user = useUser();
  const posts = usePosts(user?.id);
  return { user, posts };
}
8. Vue 的职责链模式
- 生命周期钩子:通过职责链传递处理控制权
- Vue Router 导航守卫:
router.beforeEach((to, from, next) => {
  // 身份验证链
  if (requiresAuth(to) && !isAuthenticated()) {
    next('/login');
  } else {
    next();
  }
});
9. Axios 的拦截器(责任链模式)
// 请求处理链
axios.interceptors.request.use(config => {
  config.headers.Authorization = getToken();
  return config;
});

// 响应处理链
axios.interceptors.response.use(
  response => response.data,
  error => handleError(error)
);
10. Koa 中间件机制(洋葱圈模型)
// 中间件责任链
app.use(async (ctx, next) => {
  console.log('Enter 1');
  await next(); // 传递控制权
  console.log('Exit 1');
});

app.use(async (ctx, next) => {
  console.log('Enter 2');
  await next();
  console.log('Exit 2');
});
// 执行顺序:Enter1 → Enter2 → Exit2 → Exit1

---
四、设计模式的选择策略
1. 复杂度控制:
  - 简单场景:优先使用函数式编程
  - 复杂交互:采用观察者/发布订阅模式解耦
  - 全局状态:单例模式 + 状态管理库
2. 性能权衡:
  - 代理模式会增加内存开销
  - 发布订阅模式需注意事件泄露问题
3. 框架适配:
  - React 生态:多使用组合模式、装饰器模式(HOC)
  - Vue 生态:善用观察者模式(响应式系统)

---
五、从源码中学习设计模式
案例:React Reconciler 的策略模式
React 的渲染器通过策略模式支持多平台:
// ReactDOM 的 HostConfig 策略对象
const DOMHostConfig = {
  createInstance(type, props) {
    return document.createElement(type);
  },
  appendChild(parent, child) {
    parent.appendChild(child);
  },
  // ...其他DOM操作方法
};

// React Native 实现不同策略
const NativeHostConfig = {
  createInstance(type, props) {
    return NativeModules.createView(type, props);
  }
};
案例:Vue 的工厂模式
Vue 组件实例化过程:
// 组件工厂函数
function createComponent(Ctor, props, context) {
  if (isObject(Ctor)) {
    Ctor = Vue.extend(Ctor);
  }
  const instance = new Ctor({
    propsData: props,
    parent: context
  });
  return instance;
}
其实一些框架、库的源码不懂设计模式就挺难看懂

 #想实习转正,又想准备秋招,我该怎么办#  gcHvJOf81ZPFAXKf0EfCaVPnbVJyczWt.jpg
#现在前端的就业环境真的很差吗#
全部评论
点赞 回复 分享
发布于 03-05 18:29 湖南

相关推荐

昨天去一家公司面试这家公司成立20天,目前应该有5,&nbsp;6个人,办公地点应该是老板家,三室一厅挺小的。在招岗位有前端和UI设计,我是应届,随便投了一下前端岗。在约面试之前HR就发一句“我们愿意给年轻人一个机会,状态是相互选择的”由于我没有被PUA过,没有立刻分辨出这话是个什么意思,现在回想,这家公司的氛围怎么样就可见一斑了。当我踏进他们的办公地点时,我就开始后悔没有做调查就过来了。然后开始面试。上来就说我的技能太片面了,他们想要的是一个能做产品经理&nbsp;游戏策划&nbsp;前端程序员集一体的全栈人才,并且告诉我35岁马上就会失业。先别管我以后如何哈哈,他们岗位上面写的就是招前端,过来就说我技能片面没有策划内容没有填表(他们自认是游戏公司但是不知道有策划这个岗位),很显然来者不善了,到这里我已经开始受不了,于是我随便回答应付,听她一个人说了半天我简历上的内容不行怎么样怎么样的,看我越来越敷衍就问我的核心竞争力是什么,我说我写代码,然后她说“是个人都会写代码,会英语就会写代码”大概这个意思,期间还夹着一些不知道哪里听来的话术,给我整无语了,然后说“要不我帮你想想啊小朋友(是的她说直接说我小朋友)”,我觉得还挺有意思原来PUA是这样的吗,接着她说年轻肯学上进这些都是竞争优势,哈哈我确实没想过所谓核心竞争优势这的确是个思路,然后我就笑了,接着感觉她觉得被冒犯了,说“笑什么,很好笑吗,你是要找工作的啊家里有车有房吗?”之类的话,然后还说了啥忘记了,最后走人了。总结下来就是这家公司岗位只描述一个职责但不断抽卡企图出个人才几乎全栈,集产品经理游戏策划客户端服务端的金鸡给他们下蛋。分享这件事是想看看大家的看法,另外我也想问一下,一个刚成立没多久,规模大概率长期保持在10人左右的团队,HR这样PUA一个应届生是正常的吗。#如果可以选,你最想去哪家公司# #牛客AI配图神器#
点赞 评论 收藏
分享
面试官好温柔,好好看具体描述:如图所示,分为四个部分。视频问答部分,每道题回答时间是5分钟,会给30s的思考时间,倒计时快结束的时候会提醒,第一次吓我一跳。第一部分的视频问答问:为什么选择前端开发,做了哪些准备。就一个问题,然后你说的久了,她会总结一下你说的内容&nbsp;。第二部分和第三部分的选择,这部分是考察你掌握了哪些知识(比如说最熟悉的语言是什么?),没有具体的知识点,也是为了后续调题库做准备吧。最重点的是第四部分的问题,显示有8道题,然后有一次换题的机会(真好)。不过虽然是8道题,但是会根据你的回答,延伸问下去,这部分不算题目数量。所以回答了不止8道题。(回忆版,没有按照顺序)1.前后端数据交互时,如何保证数据的有效和安全性?2.HTTPS和HTTP的比较,如何保证安全的?3.项目中有很多技术实现的方案,怎么比较选择最优的,举例说明。4.React中的受控组件和非受控组件的区别?(换题了,当时完全想不起来)5.React组件渲染时,key的作用?6.&nbsp;如何减少DOM操作?7.最近做的一次项目描述,有哪些架构,用了哪些技术栈,为什么选择这些技术栈?8.如果要写一个可以复用的组件,可以在不同浏览器和设备上使用,会考虑哪些方面哪些技术实现,步骤是什么?9.这个复用的组件如果想在不同浏览器以及跨设备显示,怎么去调试?感受:题目不难,但是很开放,第一次面试很多内容没有组织好语言,感觉答的不是很好,答的点也不是很全面。#前端开发# #暑期实习#
查看11道真题和解析
点赞 评论 收藏
分享
评论
3
23
分享

创作者周榜

更多
牛客网
牛客企业服务