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

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

---
一、前端常用设计模式实战
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 湖南

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
3
20
分享

创作者周榜

更多
牛客网
牛客企业服务