URL: http://github.com/javascript-tutorial/zh.javascript.info/pull/451.patch
€§å¿…须仅在创建时设置,然åŽä¸å†ä¿®æ”¹ã€‚ -That's exactly the case for a coffee machine: power never changes. +这就是咖啡机的实际情况:功率永远ä¸ä¼šæ”¹å˜ã€‚ -To do so, we only need to make getter, but not the setter: +è¦åšåˆ°è¿™ä¸€ç‚¹ï¼Œæˆ‘们åªéœ€è¦è®¾ç½® getterï¼Œè€Œä¸æ˜¯ setter: ```js run class CoffeeMachine { @@ -141,18 +141,18 @@ class CoffeeMachine { } -// create the coffee machine +// 创建咖啡机 let coffeeMachine = new CoffeeMachine(100); -alert(`Power is: ${coffeeMachine.power}W`); // Power is: 100W +alert(`Power is: ${coffeeMachine.power}W`); // 功率是100W coffeeMachine.power = 25; // Error (no setter) ``` -````smart header="Getter/setter functions" -Here we used getter/setter syntax. +````smart header="Getter/setter 功能" +这里我们使用 getter/setter è¯æ³•。 -But most of the time `get.../set...` functions are preferred, like this: +但大多数时候首选 `get.../set...` 函数,åƒè¿™æ ·ï¼š ```js class CoffeeMachine { @@ -171,26 +171,26 @@ class CoffeeMachine { new CoffeeMachine().setWaterAmount(100); ``` -That looks a bit longer, but functions are more flexible. They can accept multiple arguments (even if we don't need them right now). So, for the future, just in case we need to refactor something, functions are a safer choice. +è¿™çœ‹èµ·æ¥æœ‰ç‚¹é•¿ï¼Œä½†å‡½æ•°æ›´çµæ´»ã€‚他们å¯ä»¥æŽ¥å—å¤šä¸ªå‚æ•°ï¼ˆå³ä½¿æˆ‘们现在ä¸éœ€è¦å®ƒä»¬ï¼‰ã€‚å› æ¤ï¼Œä¸‡ä¸€ä»¥åŽæˆ‘们需è¦é‡æž„æŸäº›ä¸œè¥¿ï¼Œå‡½æ•°æ˜¯æ›´å®‰å…¨çš„选择。 -Surely, there's a tradeoff. On the other hand, get/set syntax is shorter, so ultimately there's no strict rule, it's up to you to decide. +å½“ç„¶ï¼Œè¿™æ˜¯ä¸€ç§æƒè¡¡çš„选择。å¦ä¸€æ–¹é¢ï¼Œget/set è¯æ³•æ›´çŸï¼Œæ‰€ä»¥æœ€ç»ˆæ²¡æœ‰ä¸¥æ ¼çš„è§„åˆ™ï¼Œè€Œæ˜¯ç”±ä½ è‡ªå·±æ¥å†³å®šã€‚ ```` -```smart header="Protected fields are inherited" -If we inherit `class MegaMachine extends CoffeeMachine`, then nothing prevents us from accessing `this._waterAmount` or `this._power` from the methods of the new class. +```smart header="å—ä¿æŠ¤çš„å—æ®µæ˜¯ç»§æ‰¿çš„" +如果我们继承 `class MegaMachine extends CoffeeMachine`ï¼Œé‚£ä¹ˆæ— æ³•é˜»æ¢æˆ‘们从新的类ä¸çš„æ–¹æ³•访问 `this._waterAmount` 或 `this._power`。 -So protected fields are naturally inheritable. Unlike private ones that we'll see below. +所以å—ä¿æŠ¤çš„å—æ®µæ˜¯è‡ªç„¶å¯ç»§æ‰¿çš„。ä¸åƒæˆ‘们接下æ¥å°†çœ‹åˆ°çš„ç§æœ‰å—段。 ``` -## Private "#waterLimit" +## ç§æœ‰çš„ “#waterLimit†[recent browser=none] -There's a finished JavaScript proposal, almost in the standard, that provides language-level support for private properties and methods. +åœ¨æ ‡å‡†ä¸å‡ 乎有个已完æˆçš„ Javascript ææ¡ˆï¼Œå®ƒä¸ºç§æœ‰å±žæ€§å’Œæ–¹æ³•æä¾›è¯è¨€çº§æ”¯æŒã€‚ -Privates should start with `#`. They are only accessible from inside the class. +ç§æœ‰å±žæ€§å’Œæ–¹æ³•应该以 `#` 开头。他们åªèƒ½ä»Žç±»çš„内部访问。 -For instance, here we add a private `#waterLimit` property and extract the water-checking logic into a separate method: +ä¾‹å¦‚ï¼Œåœ¨è¿™é‡Œæˆ‘ä»¬æ·»åŠ ä¸€ä¸ªç§æœ‰å±žæ€§ `#waterLimit`,并将检查水é‡çš„逻辑æå–到一个å•独的方法ä¸ï¼š ```js class CoffeeMachine { @@ -223,18 +223,18 @@ class CoffeeMachine { let coffeeMachine = new CoffeeMachine(); *!* -coffeeMachine.#checkWater(); // Error -coffeeMachine.#waterLimit = 1000; // Error +coffeeMachine.#checkWater(); // æ— æ•ˆ +coffeeMachine.#waterLimit = 1000; // æ— æ•ˆ */!* -coffeeMachine.waterAmount = 100; // Works +coffeeMachine.waterAmount = 100; // 有效 ``` -On the language level, `#` is a special sign that the field is private. We can't access it from outside or from inheriting classes. +在è¯è¨€å±‚é¢ï¼Œ`#` æ˜¯è¯¥å—æ®µä¸ºç§æœ‰çš„ç‰¹æ®Šæ ‡å¿—ã€‚æˆ‘ä»¬æ— æ³•ä»Žå¤–éƒ¨æˆ–ä»Žç»§æ‰¿çš„ç±»ä¸è®¿é—®å®ƒã€‚ -Private fields do not conflict with public ones. We can have both private `#waterAmount` and public `waterAmount` fields at the same time. +ç§æœ‰å—段ä¸ä¸Žå…¬å…±å—段å‘生冲çªã€‚我们å¯ä»¥åŒæ—¶æ‹¥æœ‰ç§æœ‰å±žæ€§ `#waterAmount` 和公共属性 `waterAmount`。 -For instance, let's make `waterAmount` an accessor for `#waterAmount`: +例如,让 `waterAmount` æˆä¸º `#waterAmount` 的访问器: ```js run class CoffeeMachine { @@ -257,9 +257,9 @@ machine.waterAmount = 100; alert(machine.#waterAmount); // Error ``` -Unlike protected ones, private fields are enforced by the language itself. That's a good thing. +与å—ä¿æŠ¤çš„å—æ®µä¸åŒï¼Œç§æœ‰å—段由è¯è¨€æœ¬èº«å¼ºåˆ¶æ‰§è¡Œã€‚这是好事。 -But if we inherit from `CoffeeMachine`, then we'll have no direct access to `#waterAmount`. We'll need to rely on `waterAmount` getter/setter: +但是如果我们继承 `CoffeeMachine`ï¼Œé‚£ä¹ˆæˆ‘ä»¬å°†æ— æ³•ç›´æŽ¥è®¿é—® `#waterAmount`。我们需è¦ä¾èµ– `waterAmount` getter / setter: ```js class MegaCoffeeMachine extends CoffeeMachine() { @@ -271,12 +271,12 @@ class MegaCoffeeMachine extends CoffeeMachine() { } ``` -In many scenarios such limitation is too severe. If we extend a `CoffeeMachine`, we may have legitimate reason to access its internals. That's why protected fields are used most of the time, even though they are not supported by the language syntax. +在许多情况下,这ç§é™åˆ¶å¤ªä¸¥é‡äº†ã€‚如果我们扩展一个 `CoffeeMachine`,我们å¯èƒ½æœ‰æ£å½“ç†ç”±è®¿é—®å…¶å†…部。这就是为什么大多数时候都会使用å—ä¿æŠ¤å—æ®µçš„åŽŸå› ï¼Œå³ä½¿å®ƒä»¬ä¸å—è¯è¨€è¯æ³•的支æŒã€‚ ````warn -Private fields are special. +ç§æœ‰å—段很特别。 -Remember, usually we can access fields by this[name]: +请记ä½ï¼Œé€šå¸¸æˆ‘们å¯ä»¥é€šè¿‡ this[name] è®¿é—®å—æ®µï¼š ```js class User { @@ -288,43 +288,43 @@ class User { } ``` -With private fields that's impossible: `this['#name']` doesn't work. That's a syntax limitation to ensure privacy. +ç§æœ‰å—段是ä¸å¯èƒ½çš„: `this['#name']` ä¸èµ·ä½œç”¨ã€‚这是确ä¿ç§æœ‰æ€§çš„è¯æ³•é™åˆ¶ã€‚ ```` -## Summary +## 总结 -In terms of OOP, delimiting of the internal interface from the external one is called [encapsulation]("https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)"). +å°±é¢å‘对象编程(OOP)而言,内部接å£ä¸Žå¤–部接å£çš„划分称为[å°è£…]("https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)")。 -It gives the following benefits: +它具有以下优点: -Protection for users, so that they don't shoot themselves in the feet -: Imagine, there's a team of developers using a coffee machine. It was made by the "Best CoffeeMachine" company, and works fine, but a protective cover was removed. So the internal interface is exposed. +ä¿æŠ¤ç”¨æˆ·ï¼Œä½¿ä»–ä»¬ä¸ä¼šè¯¯ä¼¤è‡ªå·± +: 想象一下,有一群开å‘人员使用咖啡机。它是由 “Best CoffeeMachine†公å¸åˆ¶é€ 的,工作æ£å¸¸ï¼Œä½†ä¿æŠ¤ç›–è¢«æ‹¿èµ°äº†ã€‚å› æ¤å†…éƒ¨æŽ¥å£æš´éœ²äº†å‡ºæ¥ã€‚ - All developers are civilized -- they use the coffee machine as intended. But one of them, John, decided that he's the smartest one, and made some tweaks in the coffee machine internals. So the coffee machine failed two days later. + 所有的开å‘人员都是文明的——他们按照预期使用咖啡机。但其ä¸ä¸€ä¸ªäººï¼Œçº¦ç¿°ï¼Œè¢«è®¤ä¸ºæ˜¯æœ€èªæ˜Žçš„,并且决定让他在咖啡机内部åšä¸€äº›è°ƒæ•´ã€‚然而咖啡机两天åŽå°±å了。 - That's surely not John's fault, but rather the person who removed the protective cover and let John do his manipulations. + è¿™è‚¯å®šä¸æ˜¯çº¦ç¿°çš„错,而是那个å–ä¸‹ä¿æŠ¤å¥—å¹¶è®©çº¦ç¿°æ‰§è¡Œè‡ªå·±æ“作的人。 - The same in programming. If a user of a class will change things not intended to be changed from the outside -- the consequences are unpredictable. + ç¼–ç¨‹ä¹Ÿä¸€æ ·ã€‚å¦‚æžœä¸€ä¸ªç±»çš„ä½¿ç”¨è€…æƒ³è¦æ”¹å˜é‚£äº›æœ¬ä¸æ‰“算从外部改å˜çš„ä¸œè¥¿â€”â€”åŽæžœæ˜¯ä¸å¯é¢„测的。 -Supportable -: The situation in programming is more complex than with a real-life coffee machine, because we don't just buy it once. The code constantly undergoes development and improvement. +坿”¯æŒçš„ +: 编程的情况比现实生活ä¸çš„å’–å•¡æœºæ›´å¤æ‚ï¼Œå› ä¸ºæˆ‘ä»¬ä¸åªæ˜¯è´ä¹°ä¸€æ¬¡ã€‚代ç 䏿–ç»åކç€å‘展和改进。 - **If we strictly delimit the internal interface, then the developer of the class can freely change its internal properties and methods, even without informing the users..** + **å¦‚æžœæˆ‘ä»¬ä¸¥æ ¼ç•Œå®šå†…éƒ¨æŽ¥å£ï¼Œé‚£ä¹ˆç±»çš„å¼€å‘人员å¯ä»¥è‡ªç”±åœ°æ›´æ”¹å…¶å†…部属性和方法,å³ä½¿æ²¡æœ‰é€šçŸ¥ç”¨æˆ·â€¦** - It's much easier to develop, if you know that certain methods can be renamed, their parameters can be changed, and even removed, because no external code depends on them. + å¦‚æžœä½ çŸ¥é“由于没有外部代ç çš„ä¾èµ–,æŸäº›æ–¹æ³•å¯ä»¥é‡å‘½åï¼Œå®ƒä»¬çš„å‚æ•°å¯ä»¥æ”¹å˜ï¼Œç”šè‡³å¯ä»¥åˆ é™¤ï¼Œè¿™æ ·çš„è¯å¼€å‘èµ·æ¥è¦å®¹æ˜“得多。 - For users, when a new version comes out, it may be a total overhaul, but still simple to upgrade if the external interface is the same. + 对于使用者æ¥è¯´ï¼Œå½“新版本出现时,它å¯èƒ½æ˜¯å…¨é¢çš„æ£€ä¿®ï¼Œä½†å¦‚果外部接å£ç›¸åŒï¼Œåˆ™ä»ç„¶å¾ˆå®¹æ˜“å‡çº§ã€‚ -Hiding complexity -: People adore to use things that are simple. At least from outside. What's inside is a different thing. +éšè—夿‚性 +: 人们喜欢使用简å•的东西。至少从外部æ¥çœ‹æ˜¯è¿™æ ·ã€‚内部的东西则是å¦å¤–一回事了。 - Programmers are not an exception. + 程åºå‘˜ä¹Ÿä¸ä¾‹å¤–。 - **It's always convenient when implementation details are hidden, and a simple, well-documented external interface is available.** + **éšè—实施细节时总是很方便,并且æä¾›äº†ä¸€ä¸ªç®€å•的,记录详细的外部接å£ã€‚** -To hide internal interface we use either protected or public properties: +为了éšè—内部接å£ï¼Œæˆ‘们使用å—ä¿æŠ¤çš„æˆ–å…¬å…±çš„å±žæ€§ï¼š -- Protected fields start with `_`. That's a well-known convention, not enforced at the language level. Programmers should only access a field starting with `_` from its class and classes inheriting from it. -- Private fields start with `#`. JavaScript makes sure we only can access those from inside the class. +- å—ä¿æŠ¤çš„å—æ®µä»¥ `_` 开头。这是一个众所周知的惯例,没有在è¯è¨€å±‚é¢å¼ºåˆ¶æ‰§è¡Œã€‚程åºå‘˜åªåº”该通过它的类和它继承的类ä¸è®¿é—®ä»¥ `_` å¼€å¤´çš„å—æ®µã€‚ +- ç§æœ‰å—段以 `#` 开头。JavaScript ç¡®ä¿æˆ‘们åªèƒ½è®¿é—®ç±»ä¸çš„内容。 -Right now, private fields are not well-supported among browsers, but can be polyfilled. +ç›®å‰ï¼Œåœ¨å„æµè§ˆå™¨ä¸ä¸æ”¯æŒç§æœ‰å—段,但å¯ä»¥ç”¨ polyfill 解决。 From 6353ee155a8ce3c594fa34905d5755c0bf17d9c0 Mon Sep 17 00:00:00 2001 From: ish-kafel <1136461977@qq.com> Date: Thu, 15 Aug 2019 08:39:37 +0800 Subject: [PATCH 2/3] Update article.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit åŒæ¥è‹±æ–‡ç‰ˆ --- .../article.md | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/1-js/09-classes/04-private-protected-properties-methods/article.md b/1-js/09-classes/04-private-protected-properties-methods/article.md index c57f6a923b..7aca962032 100644 --- a/1-js/09-classes/04-private-protected-properties-methods/article.md +++ b/1-js/09-classes/04-private-protected-properties-methods/article.md @@ -48,16 +48,16 @@ 这是个概括的介ç»ã€‚ -在 JavaScript ä¸ï¼Œæœ‰ä¸‰ç§ç±»åž‹çš„属性和æˆå‘˜ï¼š +在 JavaScript ä¸ï¼Œæœ‰ä¸¤ç§ç±»åž‹çš„å¯¹è±¡å—æ®µï¼ˆå±žæ€§å’Œæˆå‘˜ï¼‰ï¼š - 公共的:å¯ä»Žä»»ä½•地方访问。它们包å«å¤–部接å£ã€‚直到现在我们åªä½¿ç”¨å…¬å…±å±žæ€§å’Œæ–¹æ³•。 - ç§æœ‰çš„:åªèƒ½ä»Žç±»çš„内部访问。这些用于内部接å£ã€‚ -在许多其他è¯è¨€ä¸ï¼Œè¿˜å˜åœ¨â€œå—ä¿æŠ¤â€çš„å—æ®µï¼šåªèƒ½ä»Žç±»çš„内部访问和扩展它们。它们对内部接å£ä¹Ÿå¾ˆæœ‰ç”¨ã€‚它们在æŸç§æ„ä¹‰ä¸Šæ¯”ç§æœ‰çš„å±žæ€§å’Œæ–¹æ³•æ›´å¹¿æ³›ï¼Œå› ä¸ºæˆ‘ä»¬é€šå¸¸å¸Œæœ›ç»§æ‰¿ç±»æ¥èŽ·å¾—æ£ç¡®æ‰§è¡Œæ‰©å±•的访问æƒé™ã€‚ +在许多其他è¯è¨€ä¸ï¼Œè¿˜å˜åœ¨â€œå—ä¿æŠ¤â€çš„å—æ®µï¼šåªèƒ½ä»Žç±»çš„å†…éƒ¨è®¿é—®å’Œæ‰©å±•å®ƒä»¬ï¼ˆç±»ä¼¼ç§æœ‰çš„ï¼Œä½†æ˜¯åŠ ä¸Šäº†å‘继承的类的访问)。它们对内部接å£ä¹Ÿå¾ˆæœ‰ç”¨ã€‚它们在æŸç§æ„ä¹‰ä¸Šæ¯”ç§æœ‰çš„å±žæ€§å’Œæ–¹æ³•æ›´å¹¿æ³›ï¼Œå› ä¸ºæˆ‘ä»¬é€šå¸¸å¸Œæœ›ç»§æ‰¿ç±»æ¥èŽ·å¾—æ£ç¡®æ‰§è¡Œæ‰©å±•的访问æƒé™ã€‚ å—ä¿æŠ¤çš„å—æ®µä¸æ˜¯åœ¨è¯è¨€çº§åˆ«çš„ Javascript ä¸å®žçŽ°çš„ï¼Œä½†å®žé™…ä¸Šå®ƒä»¬éžå¸¸æ–¹ä¾¿ï¼Œå› æ¤å®ƒä»¬æ˜¯æ¨¡æ‹Ÿï¼ˆè¿™é‡Œæ±‚æ ¡å¯¹ï¼‰çš„ã€‚ -在下一æ¥ä¸ï¼Œæˆ‘们将使用所有这些类型的属性在 Javascript ä¸åˆ¶ä½œå’–啡机。咖啡机有很多细节,我们ä¸ä¼šå¯¹å®ƒä»¬è¿›è¡Œå…¨é¢æ¨¡æ‹Ÿä»¥ä¿æŒç®€æ´ï¼ˆå°½ç®¡æˆ‘们å¯ä»¥ï¼‰ã€‚ +现在,我们将使用所有这些类型的属性在 Javascript ä¸åˆ¶ä½œå’–啡机。咖啡机有很多细节,我们ä¸ä¼šå¯¹å®ƒä»¬è¿›è¡Œå…¨é¢æ¨¡æ‹Ÿä»¥ä¿æŒç®€æ´ï¼ˆå°½ç®¡æˆ‘们å¯ä»¥ï¼‰ã€‚ ## å—ä¿æŠ¤çš„ “waterAmount†@@ -87,7 +87,7 @@ coffeeMachine.waterAmount = 200; **å—ä¿æŠ¤çš„å±žæ€§é€šå¸¸ä»¥ä¸‹åˆ’çº¿ `_` 作为å‰ç¼€ã€‚** -è¿™ä¸æ˜¯åœ¨è¯è¨€å±‚é¢å¼ºåˆ¶å®žæ–½çš„ï¼Œä½†æ˜¯æœ‰ä¸€ç§æƒ¯ä¾‹æ˜¯ä¸åº”该从外部访问这些属性和方法。大多数程åºå‘˜éƒ½éµå¾ªå®ƒã€‚ +è¿™ä¸æ˜¯åœ¨è¯è¨€å±‚é¢å¼ºåˆ¶å®žæ–½çš„,但是有一个在程åºå‘˜ä¹‹é—´äººå°½çš†çŸ¥çš„æƒ¯ä¾‹æ˜¯ä¸åº”该从外部访问这些属性和方法。 所以我们的属性将被称为 `_waterAmount` : @@ -171,9 +171,9 @@ class CoffeeMachine { new CoffeeMachine().setWaterAmount(100); ``` -è¿™çœ‹èµ·æ¥æœ‰ç‚¹é•¿ï¼Œä½†å‡½æ•°æ›´çµæ´»ã€‚他们å¯ä»¥æŽ¥å—å¤šä¸ªå‚æ•°ï¼ˆå³ä½¿æˆ‘们现在ä¸éœ€è¦å®ƒä»¬ï¼‰ã€‚å› æ¤ï¼Œä¸‡ä¸€ä»¥åŽæˆ‘们需è¦é‡æž„æŸäº›ä¸œè¥¿ï¼Œå‡½æ•°æ˜¯æ›´å®‰å…¨çš„选择。 +è¿™çœ‹èµ·æ¥æœ‰ç‚¹é•¿ï¼Œä½†å‡½æ•°æ›´çµæ´»ã€‚他们å¯ä»¥æŽ¥å—å¤šä¸ªå‚æ•°ï¼ˆå³ä½¿æˆ‘们现在ä¸éœ€è¦å®ƒä»¬ï¼‰ã€‚ -å½“ç„¶ï¼Œè¿™æ˜¯ä¸€ç§æƒè¡¡çš„选择。å¦ä¸€æ–¹é¢ï¼Œget/set è¯æ³•æ›´çŸï¼Œæ‰€ä»¥æœ€ç»ˆæ²¡æœ‰ä¸¥æ ¼çš„è§„åˆ™ï¼Œè€Œæ˜¯ç”±ä½ è‡ªå·±æ¥å†³å®šã€‚ +å¦ä¸€æ–¹é¢ï¼Œget/set è¯æ³•æ›´çŸï¼Œæ‰€ä»¥æœ€ç»ˆæ²¡æœ‰ä¸¥æ ¼çš„è§„åˆ™ï¼Œè€Œæ˜¯ç”±ä½ è‡ªå·±æ¥å†³å®šã€‚ ```` ```smart header="å—ä¿æŠ¤çš„å—æ®µæ˜¯ç»§æ‰¿çš„" @@ -190,9 +190,9 @@ new CoffeeMachine().setWaterAmount(100); ç§æœ‰å±žæ€§å’Œæ–¹æ³•应该以 `#` 开头。他们åªèƒ½ä»Žç±»çš„内部访问。 -ä¾‹å¦‚ï¼Œåœ¨è¿™é‡Œæˆ‘ä»¬æ·»åŠ ä¸€ä¸ªç§æœ‰å±žæ€§ `#waterLimit`,并将检查水é‡çš„逻辑æå–到一个å•独的方法ä¸ï¼š +ä¾‹å¦‚ï¼Œè¿™æœ‰ä¸€ä¸ªç§æœ‰å±žæ€§ `#waterLimit`ï¼Œä»¥åŠæ£€æŸ¥æ°´é‡çš„ç§æœ‰æ–¹æ³• `#checkWater`: -```js +```js run class CoffeeMachine { *!* #waterLimit = 200; @@ -223,11 +223,10 @@ class CoffeeMachine { let coffeeMachine = new CoffeeMachine(); *!* -coffeeMachine.#checkWater(); // æ— æ•ˆ -coffeeMachine.#waterLimit = 1000; // æ— æ•ˆ +// ä¸èƒ½ä»Žç±»çš„å¤–éƒ¨è®¿é—®å…¶ç§æœ‰æ–¹æ³• +coffeeMachine.#checkWater(); // Error +coffeeMachine.#waterLimit = 1000; // Error */!* - -coffeeMachine.waterAmount = 100; // 有效 ``` 在è¯è¨€å±‚é¢ï¼Œ`#` æ˜¯è¯¥å—æ®µä¸ºç§æœ‰çš„ç‰¹æ®Šæ ‡å¿—ã€‚æˆ‘ä»¬æ— æ³•ä»Žå¤–éƒ¨æˆ–ä»Žç»§æ‰¿çš„ç±»ä¸è®¿é—®å®ƒã€‚ @@ -273,17 +272,17 @@ class MegaCoffeeMachine extends CoffeeMachine() { 在许多情况下,这ç§é™åˆ¶å¤ªä¸¥é‡äº†ã€‚如果我们扩展一个 `CoffeeMachine`,我们å¯èƒ½æœ‰æ£å½“ç†ç”±è®¿é—®å…¶å†…部。这就是为什么大多数时候都会使用å—ä¿æŠ¤å—æ®µçš„åŽŸå› ï¼Œå³ä½¿å®ƒä»¬ä¸å—è¯è¨€è¯æ³•的支æŒã€‚ -````warn +````warn header="ç§æœ‰å—段ä¸èƒ½é€šè¿‡ this[name] 访问" ç§æœ‰å—段很特别。 -请记ä½ï¼Œé€šå¸¸æˆ‘们å¯ä»¥é€šè¿‡ this[name] è®¿é—®å—æ®µï¼š +如我们所知,通常我们å¯ä»¥ä½¿ç”¨ this[name] è®¿é—®å—æ®µï¼š ```js class User { ... sayHi() { let fieldName = "name"; - alert(`Hello, ${this[fieldName]}`); + alert(`Hello, ${*!*this[fieldName]*/!*}`); } } ``` @@ -309,11 +308,11 @@ class User { 坿”¯æŒçš„ : 编程的情况比现实生活ä¸çš„å’–å•¡æœºæ›´å¤æ‚ï¼Œå› ä¸ºæˆ‘ä»¬ä¸åªæ˜¯è´ä¹°ä¸€æ¬¡ã€‚代ç 䏿–ç»åކç€å‘展和改进。 - **å¦‚æžœæˆ‘ä»¬ä¸¥æ ¼ç•Œå®šå†…éƒ¨æŽ¥å£ï¼Œé‚£ä¹ˆç±»çš„å¼€å‘人员å¯ä»¥è‡ªç”±åœ°æ›´æ”¹å…¶å†…部属性和方法,å³ä½¿æ²¡æœ‰é€šçŸ¥ç”¨æˆ·â€¦** + **å¦‚æžœæˆ‘ä»¬ä¸¥æ ¼ç•Œå®šå†…éƒ¨æŽ¥å£ï¼Œé‚£ä¹ˆç±»çš„å¼€å‘人员å¯ä»¥è‡ªç”±åœ°æ›´æ”¹å…¶å†…部属性和方法,å³ä½¿æ²¡æœ‰é€šçŸ¥ç”¨æˆ·ã€‚** - å¦‚æžœä½ çŸ¥é“由于没有外部代ç çš„ä¾èµ–,æŸäº›æ–¹æ³•å¯ä»¥é‡å‘½åï¼Œå®ƒä»¬çš„å‚æ•°å¯ä»¥æ”¹å˜ï¼Œç”šè‡³å¯ä»¥åˆ é™¤ï¼Œè¿™æ ·çš„è¯å¼€å‘èµ·æ¥è¦å®¹æ˜“得多。 + å¦‚æžœä½ æ˜¯è¿™æ ·çš„ç±»çš„å¼€å‘者,当知é“由于没有外部代ç çš„ä¾èµ–ï¼Œç§æœ‰æ–¹æ³•å¯ä»¥å®‰å…¨åœ°é‡å‘½åï¼Œå®ƒä»¬çš„å‚æ•°å¯ä»¥æ”¹å˜ï¼Œç”šè‡³å¯ä»¥åˆ 除是很棒的事。 - 对于使用者æ¥è¯´ï¼Œå½“新版本出现时,它å¯èƒ½æ˜¯å…¨é¢çš„æ£€ä¿®ï¼Œä½†å¦‚果外部接å£ç›¸åŒï¼Œåˆ™ä»ç„¶å¾ˆå®¹æ˜“å‡çº§ã€‚ + 对于使用者æ¥è¯´ï¼Œå½“新版本出现时,它å¯èƒ½æ˜¯å…¨é¢çš„内部检查,但如果外部接å£ç›¸åŒï¼Œåˆ™ä»ç„¶å¾ˆå®¹æ˜“å‡çº§ã€‚ éšè—夿‚性 : 人们喜欢使用简å•的东西。至少从外部æ¥çœ‹æ˜¯è¿™æ ·ã€‚内部的东西则是å¦å¤–一回事了。 From 86eb69a5d153a3d8f1c015f268593ba45d15a67f Mon Sep 17 00:00:00 2001 From: ish-kafel <1136461977@qq.com> Date: Fri, 16 Aug 2019 12:30:50 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article.md | 57 +++++++------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/1-js/09-classes/04-private-protected-properties-methods/article.md b/1-js/09-classes/04-private-protected-properties-methods/article.md index 7aca962032..749098f4e1 100644 --- a/1-js/09-classes/04-private-protected-properties-methods/article.md +++ b/1-js/09-classes/04-private-protected-properties-methods/article.md @@ -1,7 +1,7 @@ # ç§æœ‰çš„å’Œå—ä¿æŠ¤çš„å±žæ€§å’Œæ–¹æ³• -é¢å‘对象编程最é‡è¦çš„原则之一——划分出外部接å£å’Œå†…部接å£ã€‚ +é¢å‘对象编程最é‡è¦çš„原则之一 —— 划分出外部接å£å’Œå†…部接å£ã€‚ åœ¨å¼€å‘æ¯” “hello worldâ€ åº”ç”¨æ›´å¤æ‚的东西时,这是“必须â€çš„åšæ³•。 @@ -11,7 +11,7 @@ ## 一个真实的例å -例如咖啡机。从外é¢çœ‹å¾ˆç®€å•ï¼šä¸€ä¸ªæŒ‰é’®ï¼Œä¸€ä¸ªæ˜¾ç¤ºå™¨ï¼Œå‡ ä¸ªæ´žâ€¦â€¦å½“ç„¶ï¼Œç»“æžœå°±æ˜¯â€”â€”å¾ˆæ£’çš„å’–å•¡ï¼:) +例如咖啡机。从外é¢çœ‹å¾ˆç®€å•ï¼šä¸€ä¸ªæŒ‰é’®ï¼Œä¸€ä¸ªæ˜¾ç¤ºå™¨ï¼Œå‡ ä¸ªæ´žâ€¦â€¦å½“ç„¶ï¼Œç»“æžœå°±æ˜¯ —— 很棒的咖啡ï¼:)  @@ -21,9 +21,9 @@ 有很多细节。但我们å¯ä»¥åœ¨ä¸äº†è§£çš„æƒ…况下使用它。 -咖啡机éžå¸¸å¯é ï¼Œä¸æ˜¯å—?我们å¯ä»¥ä½¿ç”¨å¥½å‡ å¹´ï¼Œåªæœ‰åœ¨å‡ºçŽ°é—®é¢˜æ—¶â€”â€”è¿›è¡Œç»´ä¿®ã€‚ +咖啡机éžå¸¸å¯é ï¼Œä¸æ˜¯å—?我们å¯ä»¥ä½¿ç”¨å¥½å‡ å¹´ï¼Œåªæœ‰åœ¨å‡ºçŽ°é—®é¢˜æ—¶ —— 进行维修。 -咖啡机的å¯é æ€§å’Œç®€æ´æ€§çš„秘诀——所有细节都ç»è¿‡ç²¾å¿ƒè°ƒæ•´å¹¶ *éšè—* 在内部。 +咖啡机的å¯é æ€§å’Œç®€æ´æ€§çš„秘诀 —— 所有细节都ç»è¿‡ç²¾å¿ƒè°ƒæ•´å¹¶ **éšè—** 在内部。 如果我们从咖啡机上å–ä¸‹ä¿æŠ¤ç›–ï¼Œé‚£ä¹ˆä½¿ç”¨å®ƒå°†ä¼šå¤æ‚å¾—å¤šï¼ˆè¦æŒ‰å“ªé‡Œï¼Ÿï¼‰ï¼Œå¹¶ä¸”å±é™©ï¼ˆä¼šè§¦ç”µï¼‰ã€‚ @@ -35,10 +35,10 @@ 在é¢å‘对象的编程ä¸ï¼Œå±žæ€§å’Œæ–¹æ³•分为两组: -- *内部接å£* —— å¯ä»¥é€šè¿‡ç±»çš„其他方法访问,但ä¸èƒ½ä»Žå¤–部访问的方法和属性。 -- *外部接å£* —— 也å¯ä»Žç±»çš„外部访问的方法和属性。 +- **内部接å£** —— å¯ä»¥é€šè¿‡ç±»çš„其他方法访问,但ä¸èƒ½ä»Žå¤–部访问的方法和属性。 +- **外部接å£** —— 也å¯ä»Žç±»çš„外部访问的方法和属性。 -如果我们继ç»ç”¨å’–啡机进行类比——内部éšè—çš„å†…å®¹ï¼šé”…ç‚‰ç®¡ï¼ŒåŠ çƒå…ƒä»¶ç‰â€”—是其内部的接å£ã€‚ +如果我们继ç»ç”¨å’–啡机进行类比 —— 内部éšè—çš„å†…å®¹ï¼šé”…ç‚‰ç®¡ï¼ŒåŠ çƒå…ƒä»¶ç‰ —— 是其内部的接å£ã€‚ 内部接å£ç”¨äºŽå¯¹è±¡ï¼Œå®ƒçš„ç»†èŠ‚ç›¸äº’ä½¿ç”¨ã€‚ä¾‹å¦‚ï¼Œé”…ç‚‰ç®¡è¿žæŽ¥åˆ°åŠ çƒå…ƒä»¶ã€‚ @@ -48,18 +48,18 @@ 这是个概括的介ç»ã€‚ -在 JavaScript ä¸ï¼Œæœ‰ä¸¤ç§ç±»åž‹çš„å¯¹è±¡å—æ®µï¼ˆå±žæ€§å’Œæˆå‘˜ï¼‰ï¼š +在 JavaScript ä¸ï¼Œæœ‰ä¸¤ç§ç±»åž‹çš„å¯¹è±¡å—æ®µï¼ˆå±žæ€§å’Œæ–¹æ³•): - 公共的:å¯ä»Žä»»ä½•地方访问。它们包å«å¤–部接å£ã€‚直到现在我们åªä½¿ç”¨å…¬å…±å±žæ€§å’Œæ–¹æ³•。 - ç§æœ‰çš„:åªèƒ½ä»Žç±»çš„内部访问。这些用于内部接å£ã€‚ 在许多其他è¯è¨€ä¸ï¼Œè¿˜å˜åœ¨â€œå—ä¿æŠ¤â€çš„å—æ®µï¼šåªèƒ½ä»Žç±»çš„å†…éƒ¨è®¿é—®å’Œæ‰©å±•å®ƒä»¬ï¼ˆç±»ä¼¼ç§æœ‰çš„ï¼Œä½†æ˜¯åŠ ä¸Šäº†å‘继承的类的访问)。它们对内部接å£ä¹Ÿå¾ˆæœ‰ç”¨ã€‚它们在æŸç§æ„ä¹‰ä¸Šæ¯”ç§æœ‰çš„å±žæ€§å’Œæ–¹æ³•æ›´å¹¿æ³›ï¼Œå› ä¸ºæˆ‘ä»¬é€šå¸¸å¸Œæœ›ç»§æ‰¿ç±»æ¥èŽ·å¾—æ£ç¡®æ‰§è¡Œæ‰©å±•的访问æƒé™ã€‚ -å—ä¿æŠ¤çš„å—æ®µä¸æ˜¯åœ¨è¯è¨€çº§åˆ«çš„ Javascript ä¸å®žçŽ°çš„ï¼Œä½†å®žé™…ä¸Šå®ƒä»¬éžå¸¸æ–¹ä¾¿ï¼Œå› æ¤å®ƒä»¬æ˜¯æ¨¡æ‹Ÿï¼ˆè¿™é‡Œæ±‚æ ¡å¯¹ï¼‰çš„ã€‚ +å—ä¿æŠ¤çš„å—æ®µä¸æ˜¯åœ¨ Javascript è¯è¨€çº§åˆ«ä¸Šå®žçŽ°çš„ï¼Œä½†å®žé™…ä¸Šå®ƒä»¬éžå¸¸æ–¹ä¾¿ï¼Œå› 为它们是在 Javascript 䏿¨¡æ‹Ÿçš„ç±»å®šä¹‰è¯æ³•。 现在,我们将使用所有这些类型的属性在 Javascript ä¸åˆ¶ä½œå’–啡机。咖啡机有很多细节,我们ä¸ä¼šå¯¹å®ƒä»¬è¿›è¡Œå…¨é¢æ¨¡æ‹Ÿä»¥ä¿æŒç®€æ´ï¼ˆå°½ç®¡æˆ‘们å¯ä»¥ï¼‰ã€‚ -## å—ä¿æŠ¤çš„ “waterAmount†+## å—ä¿æŠ¤çš„â€œwaterAmount†让我们先åšä¸€ä¸ªç®€å•的咖啡机类: @@ -117,9 +117,9 @@ let coffeeMachine = new CoffeeMachine(100); coffeeMachine.waterAmount = -10; // Error: Negative water ``` -现在访问å—åˆ°æŽ§åˆ¶ï¼Œå› æ¤å°†æ°´é‡è®¾ç½®ä¸ºå°äºŽé›¶çš„æ•°å¤±è´¥äº†ã€‚ +现在访问å—åˆ°æŽ§åˆ¶ï¼Œå› æ¤å°†æ°´é‡è®¾ç½®ä¸ºå°äºŽé›¶çš„æ•°å°†ä¼šå¤±è´¥ã€‚ -## åªè¯»çš„ “power†+## åªè¯»çš„“power†对于 `power` 属性,让我们将它设为åªè¯»çš„。有时候一个属性必须仅在创建时设置,然åŽä¸å†ä¿®æ”¹ã€‚ @@ -144,12 +144,12 @@ class CoffeeMachine { // 创建咖啡机 let coffeeMachine = new CoffeeMachine(100); -alert(`Power is: ${coffeeMachine.power}W`); // 功率是100W +alert(`Power is: ${coffeeMachine.power}W`); // 功率是:100W coffeeMachine.power = 25; // Error (no setter) ``` -````smart header="Getter/setter 功能" +````smart header="Getter/setter 函数" 这里我们使用 getter/setter è¯æ³•。 但大多数时候首选 `get.../set...` 函数,åƒè¿™æ ·ï¼š @@ -182,7 +182,7 @@ new CoffeeMachine().setWaterAmount(100); 所以å—ä¿æŠ¤çš„å—æ®µæ˜¯è‡ªç„¶å¯ç»§æ‰¿çš„。ä¸åƒæˆ‘们接下æ¥å°†çœ‹åˆ°çš„ç§æœ‰å—段。 ``` -## ç§æœ‰çš„ “#waterLimit†+## ç§æœ‰çš„“#waterLimit†[recent browser=none] @@ -205,19 +205,6 @@ class CoffeeMachine { } */!* - _waterAmount = 0; - - set waterAmount(value) { -*!* - this.#checkWater(value); -*/!* - this._waterAmount = value; - } - - get waterAmount() { - return this._waterAmount; - } - } let coffeeMachine = new CoffeeMachine(); @@ -264,7 +251,7 @@ alert(machine.#waterAmount); // Error class MegaCoffeeMachine extends CoffeeMachine() { method() { *!* - alert( this.#waterAmount ); // Error: can only access from CoffeeMachine + alert( this.#waterAmount ); // 错误:åªèƒ½ä»Ž CoffeeMachine ä¸è®¿é—® */!* } } @@ -275,7 +262,7 @@ class MegaCoffeeMachine extends CoffeeMachine() { ````warn header="ç§æœ‰å—段ä¸èƒ½é€šè¿‡ this[name] 访问" ç§æœ‰å—段很特别。 -如我们所知,通常我们å¯ä»¥ä½¿ç”¨ this[name] è®¿é—®å—æ®µï¼š +如我们所知,通常我们å¯ä»¥ä½¿ç”¨ `this[name]` è®¿é—®å—æ®µï¼š ```js class User { @@ -297,13 +284,13 @@ class User { 它具有以下优点: ä¿æŠ¤ç”¨æˆ·ï¼Œä½¿ä»–ä»¬ä¸ä¼šè¯¯ä¼¤è‡ªå·± -: 想象一下,有一群开å‘人员使用咖啡机。它是由 “Best CoffeeMachine†公å¸åˆ¶é€ 的,工作æ£å¸¸ï¼Œä½†ä¿æŠ¤ç›–è¢«æ‹¿èµ°äº†ã€‚å› æ¤å†…éƒ¨æŽ¥å£æš´éœ²äº†å‡ºæ¥ã€‚ +: 想象一下,有一群开å‘人员使用咖啡机。它是由“Best CoffeeMachineâ€å…¬å¸åˆ¶é€ 的,工作æ£å¸¸ï¼Œä½†ä¿æŠ¤ç›–è¢«æ‹¿èµ°äº†ã€‚å› æ¤å†…éƒ¨æŽ¥å£æš´éœ²äº†å‡ºæ¥ã€‚ - 所有的开å‘人员都是文明的——他们按照预期使用咖啡机。但其ä¸ä¸€ä¸ªäººï¼Œçº¦ç¿°ï¼Œè¢«è®¤ä¸ºæ˜¯æœ€èªæ˜Žçš„,并且决定让他在咖啡机内部åšä¸€äº›è°ƒæ•´ã€‚然而咖啡机两天åŽå°±å了。 + 所有的开å‘人员都是文明的 —— 他们按照预期使用咖啡机。但其ä¸ä¸€ä¸ªäººï¼Œçº¦ç¿°ï¼Œè¢«è®¤ä¸ºæ˜¯æœ€èªæ˜Žçš„,并且决定让他在咖啡机内部åšä¸€äº›è°ƒæ•´ã€‚然而咖啡机两天åŽå°±å了。 - è¿™è‚¯å®šä¸æ˜¯çº¦ç¿°çš„错,而是那个å–ä¸‹ä¿æŠ¤å¥—å¹¶è®©çº¦ç¿°æ‰§è¡Œè‡ªå·±æ“作的人。 + è¿™è‚¯å®šä¸æ˜¯çº¦ç¿°çš„错,而是那个å–ä¸‹ä¿æŠ¤å¥—å¹¶è®©çº¦ç¿°æ‰§è¡Œè‡ªå·±æ“作的人的错。 - ç¼–ç¨‹ä¹Ÿä¸€æ ·ã€‚å¦‚æžœä¸€ä¸ªç±»çš„ä½¿ç”¨è€…æƒ³è¦æ”¹å˜é‚£äº›æœ¬ä¸æ‰“算从外部改å˜çš„ä¸œè¥¿â€”â€”åŽæžœæ˜¯ä¸å¯é¢„测的。 + ç¼–ç¨‹ä¹Ÿä¸€æ ·ã€‚å¦‚æžœä¸€ä¸ªç±»çš„ä½¿ç”¨è€…æƒ³è¦æ”¹å˜é‚£äº›æœ¬ä¸æ‰“算从外部改å˜çš„东西 —— åŽæžœæ˜¯ä¸å¯é¢„测的。 坿”¯æŒçš„ : 编程的情况比现实生活ä¸çš„å’–å•¡æœºæ›´å¤æ‚ï¼Œå› ä¸ºæˆ‘ä»¬ä¸åªæ˜¯è´ä¹°ä¸€æ¬¡ã€‚代ç 䏿–ç»åކç€å‘展和改进。 @@ -321,7 +308,7 @@ class User { **éšè—实施细节时总是很方便,并且æä¾›äº†ä¸€ä¸ªç®€å•的,记录详细的外部接å£ã€‚** -为了éšè—内部接å£ï¼Œæˆ‘们使用å—ä¿æŠ¤çš„æˆ–å…¬å…±çš„å±žæ€§ï¼š +为了éšè—内部接å£ï¼Œæˆ‘们使用å—ä¿æŠ¤çš„æˆ–ç§æœ‰çš„属性: - å—ä¿æŠ¤çš„å—æ®µä»¥ `_` 开头。这是一个众所周知的惯例,没有在è¯è¨€å±‚é¢å¼ºåˆ¶æ‰§è¡Œã€‚程åºå‘˜åªåº”该通过它的类和它继承的类ä¸è®¿é—®ä»¥ `_` å¼€å¤´çš„å—æ®µã€‚ - ç§æœ‰å—段以 `#` 开头。JavaScript ç¡®ä¿æˆ‘们åªèƒ½è®¿é—®ç±»ä¸çš„内容。Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: