工厂函数通过闭包封装私有变量,返回对象的方法可访问但不暴露内部状态,确保外部无法直接读写;每个调用创建独立封闭状态,实现模块化与无副作用。

在 JavaScript 中,工厂函数通过闭包机制返回一个带有私有状态的对象,这个对象的内部状态无法被外部直接访问或修改,只能通过返回的方法进行受控操作。
用闭包封装私有变量
工厂函数内部声明变量,然后返回一个对象(或函数),该对象的方法可以访问这些变量——因为它们处于同一个词法作用域中。这些变量就是“封闭状态”。
- 变量定义在工厂函数作用域内,不暴露在返回对象上
- 返回的对象方法形成闭包,持续持有对这些变量的引用
- 即使工厂函数执行完毕,变量仍保留在内存中,供返回的方法使用
返回普通对象并暴露受限接口
最常见方式是返回一个字面量对象,其方法作为访问器或操作器,控制对封闭状态的读写。
// 示例:计数器工厂
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function createCounter(initial = 0) {
let count = initial; // 封闭状态:外部无法直接访问 count
return {
increment() { count++; },
decrement() { count--; },
value() { return count; }
};
}
const counter = createCounter(5);
counter.increment();
console.log(counter.value()); // 6
// counter.count → undefined(不可访问)
返回构造器函数或类实例(可选进阶)
如果需要多个实例共享同一套行为但各自独立状态,仍可用工厂函数返回新函数或实例,同时保持闭包隔离。
- 每个调用 createCounter() 都创建独立的 count 变量
- 返回的函数或对象彼此之间状态完全隔离
- 适合实现模块化、可配置、无全局副作用的组件
避免意外暴露状态
注意不要在返回对象中直接返回封闭变量(如 return { count };),否则会泄露引用;也不要返回修改原始变量的 setter 方法(如 setCount: (v) => count = v),除非你明确允许外部赋值。
真正“封闭”的关键是:状态变量仅存在于闭包中,且只通过你设计的逻辑路径间接影响它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










