原型链机制不直接实现工厂模式,但可与工厂函数配合:工厂创建对象并设置实例属性,原型提供共享方法,通过object.create()链接原型以复用行为、避免重复定义。

原型链机制本身不直接实现工厂模式,但可以和工厂函数配合使用,让工厂创建的对象共享方法、避免重复定义,同时保留工厂模式的灵活性。
工厂函数负责创建对象,原型负责复用方法
工厂模式的核心是“封装创建逻辑”,而原型链的核心是“共享属性与方法”。两者结合时,通常把实例独有的数据(如 name、age)在工厂函数内通过字面量或 Object.assign 设置,把通用行为(如 sayName、toString)挂到某个共用原型对象上,再让每个新对象的 __proto__ 指向它。
- 不推荐直接修改 Object.prototype,应创建专属原型对象
- 可通过 Object.setPrototypeOf(obj, proto) 或构造函数 + prototype 配合 new 实现原型链接
- 若坚持纯工厂(不用 new),可用 Object.create(proto) 创建对象并指定原型
用 Object.create() 构建带原型的工厂对象
这是最贴近“原型链 + 工厂”组合的写法:先定义一个方法集作为原型,再在工厂中用 Object.create() 创建实例,使其自然继承该原型。
- 定义共享原型:const personProto = { sayName() { console.log(this.name); } };
- 工厂函数返回基于该原型的新对象:function createPerson(name, age) { const obj = Object.create(personProto); obj.name = name; obj.age = age; return obj; }
- 所有 createPerson() 返回的对象都共享 sayName 方法,且 instanceof 判断虽仍为 Object,但可自定义 isPerson() 辅助判断
注意类型识别与继承链完整性
纯工厂 + 原型链的组合会丢失 constructor 和 instanceof 的天然支持。如果需要类型标识,可在原型上显式添加 constructor 属性,或搭配构造函数使用(即“混合模式”):
- 在 personProto 上加:personProto.constructor = function Person() {};
- 或改用构造函数 + 工厂外观:内部用 new Person(),对外仍暴露 createPerson 接口,兼顾语义与原型复用
- 避免把引用类型(如数组、对象)直接放在原型上,否则多个实例会意外共享——这是原型链常见陷阱
这种组合不是替代,而是取长补短:工厂管“怎么造”,原型管“造什么样子”,二者协作才能既灵活又高效。











