Private declarations S1
中文标题:私有声明
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案引入了私有声明,允许类词法作用域外部的可信代码访问私有状态。它支持为子类提供受保护状态、通过友元函数进行受控访问,以及在非类对象工厂上使用私有字段。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
私有声明
一项提案,用于添加私有声明,允许类词法作用域 外部 的可信代码访问私有状态。
这还允许我们将私有状态引入普通对象!
可能的后续提案可以允许将私有声明共享给友好的模块。
支持者
- Justin Ridgewell (@jridgewell)
- Kevin Gibbons (@bakkot)
状态
当前阶段: 1
指导性用例
“受保护”状态
在实现类层级时,受保护状态是一种有价值的可见性状态。例如,可以使用钩子模式允许子类覆盖代码:
这里,AttributeCommitter 明确允许可信的(写在同一个源文件中的)子类覆盖 #createPart 方法的行为。默认情况下,返回普通的 AttributePart。但 PropertyCommitter 仅处理属性,会返回 PropertyPart。所有其他代码都可以通过 AttributeCommitter 的正常公开可见的字段/方法进行继承。
注意,这并不会授予文件外部代码覆盖 #createPart 方法的权限,因为 #createPart 私有声明仅在其声明的作用域内可见。
友元类/函数
有关 C++ 中的先例,请参见 https://en.wikipedia.org/wiki/Friend_function。
AMP 项目有一种特定的分阶段 lint 模式,非常适合用于保护受限代码访问的友元函数。首先,静态使用的函数比对象作用域的方法调用更容易进行 lint 检查,因为我们不需要知道对象的类型。因此,判断这是受限调用还是使用相同方法名的非受限调用要容易得多。例如,更容易看出静态导出 registerExtendedTemplate 是受限的,而 obj.registerExtendedTemplate 不是。
非类对象工厂
并非所有代码都希望使用 class。有时您仍然希望在这种情况下拥有私有字段。