工厂模式用函数返回匿名对象,类型统一为object;构造函数模式用new创建有身份对象,支持instanceof和constructor识别。

工厂模式和构造函数模式是 JavaScript 中两种基础且常用的对象创建方式,它们解决的是“如何批量生成结构相似对象”这一核心问题,但设计思路和运行机制有本质区别。
工厂模式:用函数封装对象创建逻辑
工厂模式本质是一个普通函数,它内部手动创建对象、添加属性和方法,最后显式返回该对象。不依赖 new,也不涉及原型链。
典型写法:
function createPerson(name, age, job) {
const obj = new Object();
obj.name = name;
obj.age = age;
obj.job = job;
obj.sayName = function() { alert(this.name); };
return obj;
}
调用时直接执行:
const p1 = createPerson('Alice', 30, 'Engineer');
const p2 = createPerson('Bob', 28, 'Designer');
- 所有实例都是 Object 类型,无法准确识别具体类型(
p1 instanceof createPerson恒为 false) - 每个对象的方法都是独立副本,内存不共享
- 优点是简单直观、无需关注 this 和 new,适合快速产出一次性或配置化对象
构造函数模式:用 new 调用,绑定 this 与原型
构造函数是一个约定以大写字母开头的普通函数,必须配合 new 使用。它不显式创建对象,也不 return,而是通过 this 向新实例注入属性和方法。
典型写法:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() { alert(this.name); };
}
调用必须加 new:
const p1 = new Person('Alice', 30, 'Engineer');
const p2 = new Person('Bob', 28, 'Designer');
- 每个实例的 constructor 属性指向 Person,支持类型识别:
p1 instanceof Person返回 true - 仍存在方法重复创建的问题(
p1.sayName === p2.sayName为 false),这是它的主要缺陷 - new 调用会自动完成四步:创建空对象 → 绑定原型 → 执行函数(this 指向新对象)→ 返回该对象
关键差异一目了然
最核心的区别不在语法,而在对象归属关系与类型系统支持:
- 工厂函数返回的是“匿名对象”,类型统一为 Object;构造函数返回的是“有身份的对象”,类型可追溯到自定义构造器
- 工厂模式更像“流水线打包”,构造函数模式更像“按模具铸造”
- 构造函数天然支持 instanceof 和 .constructor,便于做类型判断和继承扩展;工厂模式需额外字段(如
type: 'Person')模拟类型
怎么选?看实际需求
没有绝对优劣,只看场景是否匹配:
- 需要明确类型、后续可能扩展原型或做 instanceof 判断 → 选构造函数模式
- 只是临时拼一个配置对象、参数驱动的简单实体、或不想暴露构造细节 → 工厂模式 更轻量自然
- 现代开发中,两者常被 class 或 工厂函数 + Object.assign / 解构 替代,但理解它们仍是掌握原型机制的起点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











