工厂函数是用函数封装对象创建逻辑并返回新对象,适合批量生成结构相同、属性值不同的实例,比字面量更简洁、比类更轻量,支持默认值、校验及函数式编程风格。

工厂函数是用函数封装对象创建逻辑,返回新对象,适合批量生成结构相同、属性值不同的实例,比重复写 {} 更简洁,也比类更轻量。
工厂函数的基本写法
定义一个函数,接收初始化参数,内部创建并返回对象:
function createUser(name, age, role) {
return {
name,
age,
role,
introduce() {
return `我是${this.name},${this.age}岁,职位是${this.role}`;
}
};
}
const user1 = createUser("小明", 25, "前端");
const user2 = createUser("小红", 28, "产品");
每次调用都生成独立对象,属性和方法互不干扰。
用工厂函数批量生成对象数组
结合数组方法(如 map)可高效批量创建:
立即学习“Java免费学习笔记(深入)”;
const userData = [
{ name: "张三", age: 30, role: "设计师" },
{ name: "李四", age: 26, role: "后端" },
{ name: "王五", age: 24, role: "测试" }
];
const users = userData.map(({ name, age, role }) => createUser(name, age, role));
// users 是三个独立对象组成的数组
- 数据与创建逻辑分离,便于维护和复用
- 避免手动多次调用,减少重复代码
- 支持从 API 响应、配置列表等动态源生成对象
增强工厂:支持默认值和校验
实际项目中常需容错处理,可在工厂内加入简单校验或默认值:
function createUser(name, age, role) {
if (!name || typeof name !== 'string') {
throw new Error('name 必须是非空字符串');
}
return {
name: name.trim(),
age: Number(age) >= 0 ? Number(age) : 0,
role: role || '实习生',
isActive: true,
createdAt: new Date()
};
}
- 自动过滤空格、转换数字、补全默认字段
- 错误提示明确,便于调试
- 保持返回对象结构一致,下游使用更安全
和类对比:什么场景选工厂函数
工厂函数不是替代 class,而是适用特定需求:
- 不需要继承、不需要
instanceof判断类型 - 对象逻辑简单,不涉及复杂生命周期或私有状态
- 想避免
this绑定问题,或在模块中导出多个相似工厂 - 配合函数式编程风格,强调不可变和纯函数(只要不修改入参,工厂函数可视为纯函数)
如果需要共享方法、节省内存,或后续可能扩展为类体系,那 class 或构造函数更合适;否则工厂函数轻快直接,够用就好。


















