原型式继承与工厂模式结合时,代码简洁的关键在于避免重复创建构造函数、减少冗余属性定义,并让工厂函数专注“生成实例”,把共用行为统一挂载到原型上。

把共享方法提到原型链上
工厂函数负责初始化实例属性,原型负责承载所有实例复用的方法。这样每个实例不携带函数副本,内存更省,代码也更清晰。
- 不要在工厂函数内部定义方法(比如
obj.method = function() {...}) - 统一在构造函数或原型对象上定义方法,再让工厂返回的新对象继承它
- 例如:用
Object.create(SharedPrototype)创建新对象,再补上专属属性
用 Object.assign 简化属性注入
工厂函数常需给新对象设置多个初始属性。比起逐个赋值,Object.assign 一行就能合并配置项和默认值。
- 写法示例:
Object.assign(Object.create(PersonProto), { name, age }) - 可配合解构默认参数,让工厂函数调用更干净:
createPerson({ name = 'anonymous', age = 0 } = {})
封装原型对象为常量,避免重复声明
把原型对象提前定义好,工厂函数只做“组装”动作。既利于复用,也方便测试和维护。
- 把原型方法集中在一个对象里,比如
const animalProto = { speak() { ... } } - 工厂函数不再关心“怎么实现”,只管“用哪个原型 + 填什么数据”
- 多个相似工厂可共享同一原型,或通过
Object.setPrototypeOf()动态关联
必要时用类语法糖替代手动原型操作
ES6 class 并不改变原型继承本质,但能让结构更直观。工厂函数可以返回 new MyClass(...),而把原型逻辑交给 class 管理。
- class 内部自动绑定原型方法,无需手动
MyClass.prototype.xxx = ... - 工厂函数退化为带校验/适配逻辑的构造器包装层,职责更单一
- 注意:仍要避免在 class 构造器中重复定义函数,保持方法在原型上











