私有属性必须用语言原生机制“锁死”核心变量:js用#前缀触发语法错误,python用__触发名称改写,java用private实现编译期拦截;所有访问须经带校验的public方法,返回值需深拷贝或只读代理,并辅以日志、计数、类型系统与嵌入式文档约束。

用私有属性把核心变量“锁死”,新人改不了,也看不见——这才是真正防误操作的硬手段。
私有属性必须用语言原生机制,不能靠命名约定
比如 JavaScript 里必须用 # 前缀(如 #cacheKey),Python 用双下划线 __internalState,Java 用 private。光靠下划线命名(如 _internal)或注释说明“别动”,对新人毫无约束力,IDE 不报错、运行时不拦截、代码审查容易漏掉。
- JS 中
this.#config在类外访问直接抛SyntaxError,连编译都过不去 - Python 的
__触发名称改写(name mangling),子类调用obj.__data会 AttributeError - Java 的
private final Map<string object> registry;</string>编译期就禁止外部赋值或反射绕过(除非显式 setAccessible(true),但需额外权限且易被安全扫描捕获)
所有对外暴露的入口必须经过校验层,不直连私有变量
新人能调用的只有 public 方法,而这些方法内部才接触私有属性——中间必须加一层数据合法性判断和行为拦截。
- 比如组件有个
updateTheme(theme)方法,它不直接赋值this.#theme = theme,而是先检查theme是否在预设白名单里,再更新 - 设置类配置时,
setConfig(config)方法应拒绝 undefined、null 或结构不符的对象,而不是默默存进#rawConfig - 避免出现
getConfig() { return this.#config; }这种裸露返回——应返回深拷贝或只读代理(如 JS 的structuredClone()或Object.freeze())
关键状态变更必须绑定明确副作用,让误操作立刻可见
私有属性不只是“藏起来”,更要让它变化时留下痕迹——比如日志、断言、或触发不可忽略的警告。
- 在 setter 内部加
console.warn('[COMPONENT] Internal state reset — check init flow'),新人看到控制台红字自然会停手 - 对核心变量做变更计数,比如
#reinitCount,超过阈值自动 throw Error 并附带调用栈提示“请勿频繁重置” - 结合 TypeScript 的 readonly 类型 + 私有字段,让类型系统在编码阶段就报错:例如
readonly #version: string;,赋值语句直接标红
文档和开发体验要跟上,否则私有=黑盒
光靠技术封锁不够,新人得知道“为什么不能动”,以及“该动哪里”。文档不是贴在 Wiki 上就完事,要嵌入到开发流中。
- 在类顶部写 JSDoc 明确标注:
/** @private — internal cache, mutated only by init() and refresh() */ - VS Code 插件可配置规则:当检测到
this.#被出现在非本类方法中时,高亮并提示“非法访问内部状态” - 提供标准扩展点:比如
onBeforeRender钩子函数,让新人在公开接口里加逻辑,而不是去翻私有字段找“能改的地方”











