工厂函数通过普通函数返回定制对象,支持灵活创建、闭包私有性、动态混入行为、模拟继承及可选原型复用,适合配置驱动与避免原型污染场景。

工厂函数在 JavaScript 中不依赖 class 或 new,而是通过普通函数返回定制对象,天然支持灵活创建、组合与轻量继承,特别适合配置驱动、多变结构或需避免原型污染的场景。
用闭包封装私有状态与行为
工厂函数内部定义变量和函数,外部无法直接访问,实现真正的私有性,比 ES6 class 的 # 私有字段更早兼容、更可控。
- 返回对象只暴露需要的方法,内部数据(如计数器、缓存)被安全隔离
- 每个实例拥有独立闭包环境,互不影响
例如:
function createCounter(initial = 0) {let count = initial;
return {
increment() { count++; },
decrement() { count--; },
get() { return count; }
};
}
动态混入行为(Composition over Inheritance)
工厂函数可接收“能力模块”作为参数,在创建对象时按需组合,替代传统继承链,更直观、更易测试。
- 把通用功能拆成纯函数(如
loggable、serializable),在工厂中 shallow merge 进返回对象 - 避免子类爆炸,同一构造逻辑可产出带不同能力的对象
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const createLoggerUser = (name) => loggable({ name, greet() { return `Hi, ${this.name}`; } });
模拟继承:复用父级工厂并扩展
没有 extends,但可通过调用父工厂获取基础对象,再添加/覆盖属性,实现语义上的“继承”。
- 父工厂返回对象,子工厂解构或浅拷贝它,再注入特有逻辑
- 若需方法复用,可保留对父对象方法的引用(如
superGreet),避免重复实现
例如:
function createAnimal(species) {return { species, move() { return `${this.species} is moving`; } };
}
function createDog(name, breed) {
const animal = createAnimal('Dog');
return { ...animal, name, breed, bark() { return 'Woof!'; } };
}
配合 Object.setPrototypeOf 实现原型级复用(可选进阶)
如果需要共享方法节省内存(比如大量实例共用同一批方法),可在工厂内设置原型,但保持接口仍是函数调用。
- 用
Object.setPrototypeOf(obj, prototype)手动挂载原型 - 原型对象可提前定义,也可由另一个工厂生成
- 注意:这会引入原型链查找,调试时需留意
obj.constructor可能不直观
小技巧:为方便识别,可在返回对象上显式加 type 字段,代替 instanceof 判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










