javascript封装私有状态的三种方式:闭包+工厂函数(兼容性最佳)、iife(适合模块作用域)、es6类+#私有字段(现代推荐)。三者均通过作用域隔离实现真正私有,避免下划线约定等伪私有方案。

JavaScript 中通过闭包(Closure)实现模块内部私有状态与公开方法的封装,是最经典、最可靠的方式。核心思路是:利用函数作用域隔离变量,返回一个仅暴露特定方法的对象,而内部变量无法被外部直接访问。
闭包 + 工厂函数:基础封装模式
定义一个外层函数,在其内部声明变量(私有状态)和函数(私有/公开逻辑),再返回一个对象,该对象的属性是可被外部调用的方法,这些方法因闭包仍能访问内部变量。
例如:
function createCounter() {
let count = 0; // 私有状态:外部无法直接读写
<p>return {
increment() { count++; },
decrement() { count--; },
getValue() { return count; } // 公开读取接口
};
}</p><p>const counter = createCounter();
counter.increment();
console.log(counter.getValue()); // 1
console.log(counter.count); // undefined —— 无法直接访问</p>立即执行函数表达式(IIFE):模拟模块作用域
适用于需要一次性创建模块、避免污染全局命名空间的场景。IIFE 执行后返回一个接口对象,内部变量被封闭在函数作用域中。
例如:
const MathUtils = (function() {
const PI_SQUARED = Math.PI * Math.PI; // 私有常量
<p>function roundToTwo(num) {
return Math.round(num * 100) / 100;
}</p><p>return {
areaOfCircle(radius) {
return roundToTwo(PI_SQUARED <em> radius </em> radius);
},
// roundToTwo 不暴露,仅内部使用
};
})();</p><p>MathUtils.areaOfCircle(2); // ✅ 可用<br>
MathUtils.roundToTwo(3.14159); // ❌ 报错:undefined</p>ES6 类 + #私有字段(现代语法支持)
ES2022 起,类支持真正的私有字段(以 # 开头),语法更直观,且由语言级保障不可外部访问。
注意:私有字段只能在类定义内部访问,必须显式声明;方法可公开或私有(也用 # 前缀)。
- 私有字段和私有方法名必须带 #,且不能通过字符串、反射等方式绕过
- 公开方法可自由调用私有成员,但外部调用时会报错
- 兼容性需留意:Node.js ≥ 16.0,主流浏览器均支持(Chrome 91+、Firefox 90+ 等)
class BankAccount {
#balance = 0;
#transactionLog = [];
<p>constructor(initial) {
this.#balance = initial;
}</p><p>deposit(amount) {
if (amount > 0) {
this.#balance += amount;
this.#log(<code>+${amount}</code>);
}
}</p><p>getBalance() {
return this.#balance; // ✅ 允许
}</p><h1>log(msg) { // 私有方法</h1><pre class="brush:php;toolbar:false;">this.#transactionLog.push(`${Date.now()}: ${msg}`);} }
const account = new BankAccount(100); account.deposit(50); console.log(account.getBalance()); // 150 console.log(account.#balance); // ❌ SyntaxError
关键区别与选型建议
- 闭包模式:兼容性最好(支持所有 JS 环境),适合库开发或需支持旧环境的项目
- IIFE 模式:适合组织单个独立模块,常见于早期模块化(如 UMD)或配置封装
- #私有字段:语义清晰、类型工具(如 TypeScript)支持好、调试体验佳,推荐新项目优先使用
- 不推荐用下划线约定(如 _internal)代替私有——它只是提示,无实际保护力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











