pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

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 @@ ## ä¸€ä¸ªçœŸå®žçš„ä¾‹å­ -例如咖啡机。从外é¢çœ‹å¾ˆç®€å•:一个按钮,一个显示器,几个洞……当然,结果就是——很棒的咖啡ï¼:) +例如咖啡机。从外é¢çœ‹å¾ˆç®€å•:一个按钮,一个显示器,几个洞……当然,结果就是 —— 很棒的咖啡ï¼:) ![](coffee.jpg) @@ -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 ç¡®ä¿æˆ‘们åªèƒ½è®¿é—®ç±»ä¸­çš„内容。 pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy