跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
JavaScript私有字段
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= JavaScript私有字段 = '''JavaScript私有字段'''(Private Fields)是ECMAScript 2022(ES13)引入的一项新特性,允许在类中定义仅能在类内部访问的成员变量。私有字段通过<code>#</code>前缀标识,提供了一种封装数据的方式,防止外部代码直接访问或修改类的内部状态。 == 介绍 == 在传统的JavaScript中,类的所有属性和方法默认都是公开的,这意味着外部代码可以自由访问和修改它们。虽然开发者可以通过命名约定(如以下划线<code>_</code>开头)表示“私有”成员,但这只是一种约定,并不能真正阻止外部访问。私有字段的引入解决了这一问题,使封装更加严格。 私有字段的主要特点: * 只能在类的内部访问,外部代码无法直接读取或修改。 * 必须在类的顶层声明,不能在构造函数或其他方法中动态添加。 * 不可通过<code>this.#field</code>以外的任何方式访问(如<code>this['#field']</code>无效)。 == 基本语法 == 私有字段通过在字段名前添加<code>#</code>符号定义: <syntaxhighlight lang="javascript"> class Person { #name; // 私有字段声明 constructor(name) { this.#name = name; // 只能在类内部赋值 } getName() { return this.#name; // 只能在类内部访问 } } const person = new Person("Alice"); console.log(person.getName()); // 输出: "Alice" console.log(person.#name); // 报错: SyntaxError </syntaxhighlight> 在上面的例子中,<code>#name</code>是私有字段,只能在<code>Person</code>类内部访问。尝试在外部访问<code>person.#name</code>会导致语法错误。 === 私有字段与公开字段对比 === {| class="wikitable" |+ 私有字段 vs 公开字段 ! 特性 !! 私有字段 !! 公开字段 |- | 定义方式 || <code>#field</code> || <code>field</code> |- | 可访问范围 || 仅类内部 || 类内外均可 |- | 动态访问 || 不支持(如<code>this['#field']</code>无效) || 支持 |} == 实际应用场景 == === 封装敏感数据 === 私有字段常用于存储不应被外部修改的数据,例如用户密码或内部状态: <syntaxhighlight lang="javascript"> class User { #password; constructor(username, password) { this.username = username; this.#password = password; } validatePassword(input) { return input === this.#password; } } const user = new User("admin", "s3cr3t"); console.log(user.validatePassword("wrong")); // false console.log(user.#password); // 报错 </syntaxhighlight> === 实现内部计数器 === 私有字段适合存储仅用于类内部逻辑的变量: <syntaxhighlight lang="javascript"> class Counter { #count = 0; increment() { this.#count++; } getCount() { return this.#count; } } const counter = new Counter(); counter.increment(); console.log(counter.getCount()); // 1 console.log(counter.#count); // 报错 </syntaxhighlight> == 高级用法 == === 私有静态字段 === 私有字段也可以声明为静态(<code>static</code>),此时它们属于类本身而非实例: <syntaxhighlight lang="javascript"> class Logger { static #logLevel = "INFO"; static setLogLevel(level) { this.#logLevel = level; } static log(message) { console.log(`[${this.#logLevel}] ${message}`); } } Logger.setLogLevel("DEBUG"); Logger.log("Test message"); // 输出: [DEBUG] Test message console.log(Logger.#logLevel); // 报错 </syntaxhighlight> === 私有字段与继承 === 私有字段不能被子类继承或覆盖: <syntaxhighlight lang="javascript"> class Parent { #secret = "hidden"; getSecret() { return this.#secret; } } class Child extends Parent { #secret = "overridden?"; // 这是新的私有字段,不会覆盖父类的#secret tryGetSecret() { return this.getSecret(); // 仍返回父类的#secret } } const child = new Child(); console.log(child.tryGetSecret()); // 输出: "hidden" </syntaxhighlight> == 兼容性与转译 == 私有字段是较新的特性,旧版浏览器或Node.js可能不支持。可以通过Babel等工具转译为兼容代码。例如,Babel会将私有字段转换为<code>WeakMap</code>存储的变量: <syntaxhighlight lang="javascript"> // 转译前 class Example { #privateField; } </syntaxhighlight> <syntaxhighlight lang="javascript"> // 转译后(简化版) var Example = (function() { var _privateField = new WeakMap(); function Example() { _privateField.set(this, void 0); } return Example; })(); </syntaxhighlight> == 总结 == JavaScript私有字段通过严格的封装机制提升了代码的安全性和可维护性。关键点: * 使用<code>#</code>前缀定义私有字段。 * 只能在声明它们的类内部访问。 * 适用于封装敏感数据或内部状态。 * 与公开字段、静态字段和继承有明确的交互规则。 通过合理使用私有字段,开发者可以构建更健壮、更易维护的面向对象代码。 [[Category:编程语言]] [[Category:JavaScript]] [[Category:Javascript现代特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)