函数表达式是实现工厂模式最自然、轻量的方式,无需new、返回灵活、天然支持闭包、易于导出组合;常见写法为箭头函数+对象字面量,进阶可封装私有状态或按条件返回不同结构。

函数表达式是实现工厂模式最自然、轻量的方式之一。它不依赖 new,不暴露构造细节,返回即用的对象或实例,特别适合前端中高频、可配置、类型明确的创建场景。
函数表达式作为工厂函数的核心优势
它本质就是一个“参数驱动的返回器”:输入描述(如类型、配置、数据),输出封装好的对象或实例。相比类或构造函数,它更贴近 JavaScript 的函数式特性,也更容易配合闭包、高阶函数做定制化扩展。
- 无需
new,避免原型链误用和this绑定陷阱 - 返回值灵活:可以是普通对象、带方法的对象、甚至延迟初始化的代理对象
- 天然支持闭包,能捕获环境变量(如 API 基地址、用户权限、主题色)用于生成定制实例
- 可直接导出、组合、柯里化,利于模块拆分与测试
常见写法:箭头函数 + 对象字面量
这是最简洁的工厂表达式形式,适用于属性固定、逻辑简单的对象创建:
const createUser = ({ name, email, role }) => ({
name,
email,
role,
id: Date.now() + Math.random(),
toString() {
return `${this.role}: ${this.name} `;
}
});
const admin = createUser({ name: 'Alice', email: 'a@example.com', role: 'admin' });
const guest = createUser({ name: 'Bob', email: 'b@example.com', role: 'guest' });
这类工厂函数返回的是普通对象,没有原型继承,内存开销小,适合大量轻量级数据对象。
进阶用法:返回带私有状态或行为的对象
利用闭包封装内部状态,对外只暴露有限接口,实现“可控实例化”:
const createCounter = (initial = 0) => {
let count = initial;
return {
increment() { count++; },
decrement() { count--; },
value() { return count; }
};
};
const counterA = createCounter(10);
counterA.increment();
console.log(counterA.value()); // 11
这种写法避免了构造函数中 this 管理的复杂性,也防止外部直接修改 count,比 class 更易控制边界。
结合条件逻辑动态返回不同结构
工厂函数可根据参数决定返回哪一类对象,保持调用统一性:
const createMessage = (type, text) => {
const base = { text, timestamp: new Date().toISOString() };
switch (type) {
case 'success':
return { ...base, type, icon: '✅', color: '#28a745' };
case 'error':
return { ...base, type, icon: '❌', color: '#dc3545' };
case 'warning':
return { ...base, type, icon: '⚠️', color: '#ffc107' };
default:
throw new Error(`Unknown message type: ${type}`);
}
};
const msg = createMessage('success', '操作完成');
// { text: '操作完成', timestamp: '...', type: 'success', icon: '✅', color: '#28a745' }
业务层只需传入语义化参数,无需知道每种消息的字段差异,后续新增类型也只需改工厂内部,不侵入调用方。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











