跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
JavaScript私有属性
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= JavaScript私有属性 = '''JavaScript私有属性'''是面向对象编程(OOP)中的一个重要概念,它允许开发者隐藏类的内部状态,防止外部直接访问或修改,从而提高代码的安全性和封装性。在JavaScript中,私有属性的实现方式随着语言的发展而不断演进,从早期的命名约定(如以下划线`_`开头)到ES2022正式引入的私有字段语法(使用`#`前缀)。 == 介绍 == 在传统的JavaScript中,对象的属性默认是公开的,这意味着任何代码都可以访问和修改它们。然而,良好的面向对象设计通常要求某些属性仅限内部使用,不应暴露给外部。私有属性正是为了解决这一问题而引入的。 JavaScript的私有属性具有以下特点: * 只能在类的内部访问,外部代码无法直接读写。 * 使用`#`作为前缀声明。 * 必须在类的顶层声明,不能在构造函数中动态添加。 == 基本语法 == 私有属性的声明和使用方式如下: <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> 在上面的例子中: * `#name`是一个私有属性,只能在`Person`类内部访问。 * 尝试从外部访问`person.#name`会导致语法错误。 == 实际应用场景 == 私有属性常用于以下场景: 1. '''隐藏内部状态''':例如,隐藏对象的敏感数据或中间计算结果。 2. '''防止意外修改''':确保关键属性只能通过受控的方法修改。 3. '''实现封装''':暴露清晰的API,隐藏实现细节。 === 示例:银行账户 === <syntaxhighlight lang="javascript"> class BankAccount { #balance = 0; // 私有属性 deposit(amount) { if (amount > 0) { this.#balance += amount; } } withdraw(amount) { if (amount > 0 && amount <= this.#balance) { this.#balance -= amount; return amount; } return 0; } getBalance() { return this.#balance; } } const account = new BankAccount(); account.deposit(100); console.log(account.getBalance()); // 输出: 100 account.withdraw(30); console.log(account.getBalance()); // 输出: 70 </syntaxhighlight> == 与传统命名约定的比较 == 在ES2022之前,开发者通常使用以下划线`_`开头的命名约定来表示"私有"属性,但这只是约定,并不能真正阻止外部访问: <syntaxhighlight lang="javascript"> class OldStyle { constructor() { this._privateData = "secret"; } } const obj = new OldStyle(); console.log(obj._privateData); // 可以访问,输出: "secret" </syntaxhighlight> 与真正的私有属性相比: {| class="wikitable" |- ! 特性 !! 真正私有属性 (`#`) !! 命名约定 (`_`) |- | 外部可访问性 || 不可访问 || 可访问 |- | 语言强制保护 || 是 || 否 |- | 需要特殊语法 || 是 || 否 |} == 高级主题 == === 私有静态属性 === 类也可以有私有静态属性,这些属性属于类本身而不是实例: <syntaxhighlight lang="javascript"> class Logger { static #logLevel = "INFO"; static setLogLevel(level) { this.#logLevel = level; } static log(message) { console.log(`[${this.#logLevel}] ${message}`); } } Logger.log("Test message"); // 输出: "[INFO] Test message" </syntaxhighlight> === 私有方法与访问器 === 除了属性,方法和访问器(getter/setter)也可以设为私有: <syntaxhighlight lang="javascript"> class Temperature { #celsius; constructor(celsius) { this.#celsius = celsius; } #validate(value) { // 私有方法 return typeof value === "number"; } set celsius(value) { if (this.#validate(value)) { this.#celsius = value; } } get celsius() { return this.#celsius; } } </syntaxhighlight> == 兼容性考虑 == 私有属性是ES2022的新特性,在旧版JavaScript引擎中不被支持。可以使用Babel等转译工具将其转换为兼容代码。 == 总结 == JavaScript私有属性提供了真正的封装能力,是面向对象编程的重要补充。它们: * 使用`#`前缀声明 * 只能在类内部访问 * 适用于属性、方法和访问器 * 比传统的命名约定更安全可靠 通过合理使用私有属性,可以构建更健壮、更安全的JavaScript应用程序。 <mermaid> classDiagram class BankAccount { -#balance: number +deposit(amount: number): void +withdraw(amount: number): number +getBalance(): number } </mermaid> 上述类图展示了使用私有属性的`BankAccount`类设计,其中`#balance`被标记为私有属性(使用`-`表示私有性,`#`是实际语法)。 [[Category:编程语言]] [[Category:JavaScript]] [[Category:Javascript面向对象编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)