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

