Skip to content

Commit

Permalink
fix redirects for private properties
Browse files Browse the repository at this point in the history
  • Loading branch information
yin1999 committed Nov 9, 2023
1 parent 5372b2e commit 6596773
Show file tree
Hide file tree
Showing 11 changed files with 16 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ class Student extends Person {
}
```

在这个类的声明中,`#year` 是一个[私有数据属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields)。我们可以构造一个 `Student` 对象,然后在内部使用 `#year`,但如果在类的外部尝试访问 `#year`,浏览器将会抛出错误:
在这个类的声明中,`#year` 是一个[私有数据属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties)。我们可以构造一个 `Student` 对象,然后在内部使用 `#year`,但如果在类的外部尝试访问 `#year`,浏览器将会抛出错误:

```js
const summers = new Student("Summers", 2);
Expand Down
2 changes: 1 addition & 1 deletion files/zh-cn/web/javascript/guide/using_classes/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ const red = new Color(255, 0, 0);
console.log(red.values[0]); // 0; 不再是 255,因为 HSL 模型下纯红色的 H 分量为 0
```

用户对 `values` 数组代表 RGB 值的假设不再成立,这可能会打破他们的代码逻辑。因此,如果你是一个类的实现者,你应该隐藏实例的内部数据结构,以保持 API 的简洁性,并防止在你做了一些“无害的重构”时,用户代码不至于崩溃。在类中,这是通过[_私有字段_](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields)来实现的。
用户对 `values` 数组代表 RGB 值的假设不再成立,这可能会打破他们的代码逻辑。因此,如果你是一个类的实现者,你应该隐藏实例的内部数据结构,以保持 API 的简洁性,并防止在你做了一些“无害的重构”时,用户代码不至于崩溃。在类中,这是通过[_私有字段_](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties)来实现的。

私有字段是以 `#`(井号)开头的标识符。井号是这个字段名的必要部分,这也就意味着私有字段永远不会与公共属性发生命名冲突。为了在类中的任何地方引用一个私有字段,你必须在类体中*声明*它(你不能在类体外部创建私有字段)。除此之外,私有字段与普通属性几乎是等价的。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,7 @@ const square = new Square(2);
<th scope="row">优点</th>
<td>
被所有现代引擎所支持。非常高的可读性和可维护性。<a
href="/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields">私有属性</a>是原型继承中没有简单替代方案的特性。
href="/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties">私有属性</a>是原型继承中没有简单替代方案的特性。
</td>
</tr>
<tr>
Expand Down
10 changes: 5 additions & 5 deletions files/zh-cn/web/javascript/reference/classes/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,11 +409,11 @@ class Bar extends calculatorMixin(randomizerMixin(Foo)) {}

## 参见

- {{jsxref("Functions", "Functions", "", "true")}}
- {{jsxref("Statements/class", "class declaration", "", "true")}}
- {{jsxref("Operators/class", "class expression", "", "true")}}
- {{jsxref("Classes/Public_class_fields", "Public class fields", "", "true")}}
- {{jsxref("Classes/Private_class_fields", "Private class fields", "", "true")}}
- {{jsxref("Functions", "函数", "", "true")}}
- {{jsxref("Statements/class", "类声明", "", "true")}}
- {{jsxref("Operators/class", "类表达式", "", "true")}}
- {{jsxref("Classes/Public_class_fields", "公有类字段", "", "true")}}
- {{jsxref("Classes/Private_properties", "私有类字段", "", "true")}}
- {{jsxref("Operators/super", "super")}}
- [Blog post: "ES6 In Depth: Classes"](https://hacks.mozilla.org/2015/07/es6-in-depth-classes/)
- [Fields and public/private class properties proposal (stage 3)](https://github.com/tc39/proposal-class-fields)
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
---
title: 类私有域
title: 私有属性
slug: Web/JavaScript/Reference/Classes/Private_properties
original_slug: Web/JavaScript/Reference/Classes/Private_class_fields
---

{{JsSidebar("Classes")}}

类属性在默认情况下是{{jsxref('Classes/Public_class_fields','公有')}}的,但可以使用增加哈希前缀 `#` 的方法来定义私有类字段,这一隐秘封装的类特性由 JavaScript 自身强制执行。
类属性在默认情况下是{{jsxref('Classes/Public_class_fields','公有', "", 1)}}的,但可以使用增加哈希前缀 `#` 的方法来定义私有类字段,这一隐秘封装的类特性由 JavaScript 自身强制执行。

## 语法

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ if (Foo.prototype.isPrototypeOf(baz)) {
}
```

然而,`Foo.prototype` 存在于 `baz` 的原型链中并不意味着 `baz` 是使用 `Foo` 作为其构造函数创建的。例如,`baz` 可以直接将 `Foo.prototype` 作为其原型。在这种情况下,如果你的代码从 `baz` 中读取 `Foo`[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields),它仍然会失败:
然而,`Foo.prototype` 存在于 `baz` 的原型链中并不意味着 `baz` 是使用 `Foo` 作为其构造函数创建的。例如,`baz` 可以直接将 `Foo.prototype` 作为其原型。在这种情况下,如果你的代码从 `baz` 中读取 `Foo`[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties),它仍然会失败:

```js
class Foo {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ thing.showPrivate();
// 1
```

这与下面使用了[私有字段](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields)的示例类似:
这与下面使用了[私有字段](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties)的示例类似:

```js
class Thing {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ console.log(it.next().value); // 2

### 使用类定义一个可迭代对象

状态封装也可以对[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields)进行。
状态封装也可以对[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties)进行。

```js
class SimpleClass {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ delete identifier;
delete object.#privateProperty;
```

因为[](/zh-CN/docs/Web/JavaScript/Reference/Classes)自动处于严格模式,而[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields)只能在类体内合法引用,这意味着私有属性永远不能被删除。虽然 `delete identifier``identifier` 指的是全局对象的可配置属性时[可能有效](#删除全局属性),但是你应该避免这种形式,而是用 [`globalThis`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis) 作为前缀。
因为[](/zh-CN/docs/Web/JavaScript/Reference/Classes)自动处于严格模式,而[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties)只能在类体内合法引用,这意味着私有属性永远不能被删除。虽然 `delete identifier``identifier` 指的是全局对象的可配置属性时[可能有效](#删除全局属性),但是你应该避免这种形式,而是用 [`globalThis`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis) 作为前缀。

虽然其他表达式是可以接受的,但是它们并不导致有意义的行为:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ const a = { x: 1, x: 2 };
console.log(a); // {x: 2}
```

在 ES2015 之后,任何地方都允许重复属性名出现,也包括[严格模式](/zh-CN/docs/Web/JavaScript/Reference/Strict_mode#duplicate_property_names)。你也可以在[](/zh-CN/docs/Web/JavaScript/Reference/Classes)中使用重复的属性名。唯一的例外是[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields),在整个类中它必须是唯一的。
在 ES2015 之后,任何地方都允许重复属性名出现,也包括[严格模式](/zh-CN/docs/Web/JavaScript/Reference/Strict_mode#duplicate_property_names)。你也可以在[](/zh-CN/docs/Web/JavaScript/Reference/Classes)中使用重复的属性名。唯一的例外是[私有属性](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties),在整个类中它必须是唯一的。

### 方法定义

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ console.log(o.a); // 38

### 类上下文

一个[](/zh-CN/docs/Web/JavaScript/Reference/Classes)可以被分为两个上下文:静态和实例。[构造函数](/zh-CN/docs/Web/JavaScript/Reference/Classes/constructor)、方法和实例字段初始化器([公有](/zh-CN/docs/Web/JavaScript/Reference/Classes/Public_class_fields)[私有](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields))属于实例上下文。[静态](/zh-CN/docs/Web/JavaScript/Reference/Classes/static)方法、静态字段初始化器和[静态初始化块](/zh-CN/docs/Web/JavaScript/Reference/Classes/Static_initialization_blocks)属于静态上下文。`this` 值在每个上下文中都是不同的。
一个[](/zh-CN/docs/Web/JavaScript/Reference/Classes)可以被分为两个上下文:静态和实例。[构造函数](/zh-CN/docs/Web/JavaScript/Reference/Classes/constructor)、方法和实例字段初始化器([公有](/zh-CN/docs/Web/JavaScript/Reference/Classes/Public_class_fields)[私有](/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_properties))属于实例上下文。[静态](/zh-CN/docs/Web/JavaScript/Reference/Classes/static)方法、静态字段初始化器和[静态初始化块](/zh-CN/docs/Web/JavaScript/Reference/Classes/Static_initialization_blocks)属于静态上下文。`this` 值在每个上下文中都是不同的。

类构造函数总是通过 `new` 调用,所以它们的行为与[构造函数](#构造函数)相同:`this` 值是正在创建的新实例。类方法的行为像对象字面量中的方法——`this` 值是方法被访问的对象。如果方法没有转移到另一个对象,`this` 通常是类的一个实例。

Expand Down

0 comments on commit 6596773

Please sign in to comment.