原型式继承以共享为核心,通过原型链复用方法、支持类型识别与继承;工厂函数以封装创建逻辑为主,对象隔离但方法默认不复用、无类型信息、扩展需手动模拟。

原型式继承和工厂函数本质目的都是创建对象,但设计思路、复用机制和适用场景差别明显。关键不在“能不能做”,而在“怎么更合理地做”。
核心出发点不同
原型式继承围绕 共享 展开:把共用的方法和属性放在原型对象上,所有实例通过 __proto__ 链接过去,节省内存、支持动态扩展。它默认假设“多数方法该被复用”。
工厂函数则围绕 封装创建逻辑 展开:每次调用都返回一个全新对象,属性和方法直接挂载在该对象上,天然隔离、无需考虑原型链,但容易重复生成函数。
方法复用方式差异大
原型式继承靠 prototype 实现方法复用:
– 所有实例共享同一份方法代码
– 修改原型上的方法,所有已有实例立即生效
– 例如:Person.prototype.sayName = function(){...},new Person() 出来的每个对象都能用且共用这个函数
工厂函数默认不复用方法:
– 每次调用都新建函数并赋值给返回对象(如 obj.sayName = function(){...})
– 每个对象都有独立副本,内存占用高
– 若想复用,得手动把函数提出来,再在工厂内引用(如 obj.sayName = sharedSayName)
对象识别与类型判断能力不同
原型式继承的对象能自然识别构造来源:
– person instanceof Person 返回 true
– person.constructor === Person 成立
– 支持基于类型的多态和 instanceof 判断
工厂函数返回的是普通对象:
– typeof createPerson() === 'object',仅此而已
– 没有 constructor 指向、无法用 instanceof 区分来源
– 类型信息丢失,调试和扩展时缺乏上下文
扩展性与继承支持度不同
原型式继承是 JS 原生继承体系的基础:
– 可轻松实现原型链继承(Child.prototype = Object.create(Parent.prototype))
– 支持组合继承、寄生组合继承等成熟方案
– 与 class 语法底层一致,兼容现代工具链
工厂函数本身不提供继承能力:
– 要模拟继承,需手动复制属性(Object.assign)、借用构造(Parent.call)或增强对象(寄生式)
– 寄生继承就是工厂函数 + 构造函数的混合体,属于“曲线救国”方案
– 更适合轻量、一次性、无继承需求的对象生成











