JavaScript 自 ES2022 起支持 # 前缀定义真正私有的静态字段和方法,仅类内部可访问;static 声明的成员默认公有且可直接调用,而 static # 成员外部不可见、不可访问,语言强制保障私有性。

JavaScript 中没有原生的 public、private、protected 访问修饰符(如 TypeScript 或 Java 中那样),但自 ES2022 起,标准 JavaScript 支持通过 # 前缀定义真正私有的静态字段和方法,同时支持 static 关键字声明静态成员。访问控制本质上依赖于作用域机制和语言规范,而非语法修饰符。
静态属性与静态方法的默认访问性
在纯 JavaScript 类中,所有用 static 声明的属性和方法,默认都是 公有(public)且可被外部直接访问 的,只要它们是顶层声明且未被封装在闭包或模块作用域中。
class Utils { static version = '1.0'; static parse(str) { return JSON.parse(str); } }-
Utils.version和Utils.parse('{ "x": 1 }')可直接调用,无需实例 - 这类成员属于类对象本身,存储在构造函数上,可通过
Utils.hasOwnProperty('version')验证
实现私有静态成员:使用井号 #
ES2022 引入的私有字段语法同样适用于静态成员:以 # 开头的静态字段或方法,仅在类内部可见,外部无法读取、修改或调用。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
class Cache { static #maxSize = 100; static #validate(key) { return typeof key === 'string'; } static set(item) { if (this.#validate(item.key)) { /* ... */ } } }-
Cache.#maxSize→ 报错:Private field '#maxSize' is not accessible outside class 'Cache' -
Cache.#validate同样不可访问;但Cache.set()内部可自由调用this.#validate() - 注意:
#成员必须在类体顶层声明,不能动态添加,也不能用字符串名访问
模拟 protected 或模块级封装
JavaScript 没有 protected 语法,但可通过设计模式或模块边界实现类似效果:
立即学习“Java免费学习笔记(深入)”;
- 模块封装:将静态成员定义在 ES 模块内,不导出,仅供本模块内类使用 —— 外部导入该类时,静态私有逻辑不可见
-
命名约定:用下划线前缀(如
static _internalConfig)提示“不应外部使用”,但无强制约束 -
继承限制:子类可继承父类的静态成员(包括
#私有成员不可继承),但无法覆盖或访问父类私有静态字段;同名声明会创建新私有字段,不构成重写
静态成员访问中的 this 指向与限制
在静态方法中,this 指向类本身(即构造函数),因此可用于调用同类其他静态成员,但不能访问实例内容。
-
static init() { this.#initDB(); this.cache = new Map(); }✅this可调用私有静态方法、赋值静态属性 -
static load() { console.log(this.name); }✅ 输出类名(如"User") -
static fail() { console.log(this.instanceValue); }❌this.instanceValue是 undefined,实例属性不在静态上下文中存在 - 静态方法中禁止使用
new this()创建实例?不,这是合法的(this是构造函数),常用于工厂方法

















