构造函数适合需类型识别、方法共享、继承扩展的领域模型;工厂模式适合轻量临时数据、多态返回和灵活调用。前者基于原型链,后者返回普通对象。

工厂模式和构造函数都是 JavaScript 中创建对象的常用方式,关键区别不在“能不能用”,而在于“要不要类型标识、要不要复用方法、要不要继承扩展”。选哪个,取决于你当前要解决的问题。
看是否需要识别对象类型
如果代码里经常要判断“这个对象是不是某种业务实体”,比如 if (obj instanceof User) 或 obj.constructor === Product,那就必须用构造函数。工厂模式返回的只是普通 Object,所有实例都显示为 Object 类型,无法区分来源。
例如:
- 工厂模式:
createUser('Alice') instanceof CreateUser→ false - 构造函数:
new User('Alice') instanceof User→ true
看方法是否需要共享节省内存
工厂模式每次调用都新建一个对象,连方法也是独立副本,user1.greet !== user2.greet。适合轻量、一次性、结构不固定的数据(如 API 响应解析)。
构造函数配合原型(User.prototype.greet = function(){...})能让所有实例共用同一个方法,避免重复创建函数,更省内存。适合有稳定接口、需长期维护的对象模型。
看是否要支持原型链或继承
只有构造函数能自然接入原型链:User.prototype 可被子类继承,也能用 Object.getPrototypeOf(user) 查链路。工厂模式完全绕过原型机制,后续想加继承、混入、代理等能力会很别扭。
比如想让 Admin 继承 User 的基础行为,构造函数可直接用 class Admin extends User;工厂函数就得手动复制属性或深拷贝逻辑,维护成本高。
看调用是否需要防御性控制
构造函数依赖 new,漏写会静默失败(this 指向错误),但可以用 new.target 或 instanceof 校验来兜底;工厂函数无此风险,调用自由,也更容易做参数校验、分支返回不同结构(比如根据 type 返回 Post 或 Comment)。
所以:简单配置、临时数据、多态返回 → 工厂;领域模型、统一接口、长期复用 → 构造函数(或现代 class)。


















