4848
4949这是个概括的介绍。
5050
51- 在 JavaScript 中,有三种类型的属性和成员 :
51+ 在 JavaScript 中,有两种类型的对象字段(属性和成员) :
5252
5353- 公共的:可从任何地方访问。它们包含外部接口。直到现在我们只使用公共属性和方法。
5454- 私有的:只能从类的内部访问。这些用于内部接口。
5555
56- 在许多其他语言中,还存在“受保护”的字段:只能从类的内部访问和扩展它们。它们对内部接口也很有用。它们在某种意义上比私有的属性和方法更广泛,因为我们通常希望继承类来获得正确执行扩展的访问权限。
56+ 在许多其他语言中,还存在“受保护”的字段:只能从类的内部访问和扩展它们(类似私有的,但是加上了向继承的类的访问) 。它们对内部接口也很有用。它们在某种意义上比私有的属性和方法更广泛,因为我们通常希望继承类来获得正确执行扩展的访问权限。
5757
5858受保护的字段不是在语言级别的 Javascript 中实现的,但实际上它们非常方便,因此它们是模拟(这里求校对)的。
5959
60- 在下一步中 ,我们将使用所有这些类型的属性在 Javascript 中制作咖啡机。咖啡机有很多细节,我们不会对它们进行全面模拟以保持简洁(尽管我们可以)。
60+ 现在 ,我们将使用所有这些类型的属性在 Javascript 中制作咖啡机。咖啡机有很多细节,我们不会对它们进行全面模拟以保持简洁(尽管我们可以)。
6161
6262## 受保护的 “waterAmount”
6363
@@ -87,7 +87,7 @@ coffeeMachine.waterAmount = 200;
8787
8888** 受保护的属性通常以下划线 ` _ ` 作为前缀。**
8989
90- 这不是在语言层面强制实施的,但是有一种惯例是不应该从外部访问这些属性和方法。大多数程序员都遵循它 。
90+ 这不是在语言层面强制实施的,但是有一个在程序员之间人尽皆知的惯例是不应该从外部访问这些属性和方法 。
9191
9292所以我们的属性将被称为 ` _waterAmount ` :
9393
@@ -171,9 +171,9 @@ class CoffeeMachine {
171171new CoffeeMachine().setWaterAmount(100);
172172```
173173
174- 这看起来有点长,但函数更灵活。他们可以接受多个参数(即使我们现在不需要它们)。因此,万一以后我们需要重构某些东西,函数是更安全的选择。
174+ 这看起来有点长,但函数更灵活。他们可以接受多个参数(即使我们现在不需要它们)。
175175
176- 当然,这是一种权衡的选择。 另一方面,get/set 语法更短,所以最终没有严格的规则,而是由你自己来决定。
176+ 另一方面,get/set 语法更短,所以最终没有严格的规则,而是由你自己来决定。
177177````
178178
179179``` smart header="受保护的字段是继承的"
@@ -190,9 +190,9 @@ new CoffeeMachine().setWaterAmount(100);
190190
191191私有属性和方法应该以 ` # ` 开头。他们只能从类的内部访问。
192192
193- 例如,在这里我们添加一个私有属性 ` #waterLimit ` ,并将检查水量的逻辑提取到一个单独的方法中 :
193+ 例如,这有一个私有属性 ` #waterLimit ` ,以及检查水量的私有方法 ` #checkWater ` :
194194
195- ``` js
195+ ``` js run
196196class CoffeeMachine {
197197* ! *
198198 #waterLimit = 200 ;
@@ -223,11 +223,10 @@ class CoffeeMachine {
223223let coffeeMachine = new CoffeeMachine ();
224224
225225* ! *
226- coffeeMachine.#checkWater (); // 无效
227- coffeeMachine.#waterLimit = 1000 ; // 无效
226+ // 不能从类的外部访问其私有方法
227+ coffeeMachine.#checkWater (); // Error
228+ coffeeMachine.#waterLimit = 1000 ; // Error
228229*/ ! *
229-
230- coffeeMachine .waterAmount = 100 ; // 有效
231230```
232231
233232在语言层面,` # ` 是该字段为私有的特殊标志。我们无法从外部或从继承的类中访问它。
@@ -273,17 +272,17 @@ class MegaCoffeeMachine extends CoffeeMachine() {
273272
274273在许多情况下,这种限制太严重了。如果我们扩展一个 ` CoffeeMachine ` ,我们可能有正当理由访问其内部。这就是为什么大多数时候都会使用受保护字段的原因,即使它们不受语言语法的支持。
275274
276- ```` warn
275+ ```` warn header="私有字段不能通过 this[name] 访问"
277276私有字段很特别。
278277
279- 请记住,通常我们可以通过 this[name] 访问字段:
278+ 如我们所知,通常我们可以使用 this[name] 访问字段:
280279
281280```js
282281class User {
283282 ...
284283 sayHi() {
285284 let fieldName = "name";
286- alert(`Hello, ${this[fieldName]}`);
285+ alert(`Hello, ${*!* this[fieldName]*/!* }`);
287286 }
288287}
289288```
@@ -309,11 +308,11 @@ class User {
309308可支持的
310309: 编程的情况比现实生活中的咖啡机更复杂,因为我们不只是购买一次。代码不断经历着发展和改进。
311310
312- **如果我们严格界定内部接口,那么类的开发人员可以自由地更改其内部属性和方法,即使没有通知用户… **
311+ **如果我们严格界定内部接口,那么类的开发人员可以自由地更改其内部属性和方法,即使没有通知用户。 **
313312
314- 如果你知道由于没有外部代码的依赖,某些方法可以重命名, 它们的参数可以改变,甚至可以删除,这样的话开发起来要容易得多 。
313+ 如果你是这样的类的开发者,当知道由于没有外部代码的依赖,私有方法可以安全地重命名, 它们的参数可以改变,甚至可以删除是很棒的事 。
315314
316- 对于使用者来说,当新版本出现时,它可能是全面的检修 ,但如果外部接口相同,则仍然很容易升级。
315+ 对于使用者来说,当新版本出现时,它可能是全面的内部检查 ,但如果外部接口相同,则仍然很容易升级。
317316
318317隐藏复杂性
319318: 人们喜欢使用简单的东西。至少从外部来看是这样。内部的东西则是另外一回事了。
0 commit comments