Skip to content

Commit 77ec3ca

Browse files
authored
Merge pull request #462 from ArmandDelessert/patch-1-js-08-prototypes
Apporte plusieurs corrections au chapitre 1.8 (Prototype)
2 parents 2a8e70d + 059dce8 commit 77ec3ca

File tree

1 file changed

+15
-16
lines changed
  • 1-js/08-prototypes/01-prototype-inheritance

1 file changed

+15
-16
lines changed

1-js/08-prototypes/01-prototype-inheritance/article.md

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ rabbit.__proto__ = animal; // sets rabbit.[[Prototype]] = animal
3333

3434
Si nous recherchons une propriété dans `rabbit`, et qu'elle en manque, JavaScript la prend automatiquement à partir de `animal`.
3535

36-
Par exemple:
36+
Par exemple :
3737

3838
```js
3939
let animal = {
@@ -47,14 +47,14 @@ let rabbit = {
4747
rabbit.__proto__ = animal; // (*)
4848
*/!*
4949

50-
// nous pouvons maintenant trouver les deux propriétés dans rabbit:
50+
// nous pouvons maintenant trouver les deux propriétés dans rabbit :
5151
*!*
5252
alert( rabbit.eats ); // true (**)
5353
*/!*
5454
alert( rabbit.jumps ); // true
5555
```
5656

57-
Ici, la ligne `(*)` définit `animal` pour être un prototype de` lapin`.
57+
Ici, la ligne `(*)` définit `animal` comme le prototype de `lapin`.
5858

5959
Ensuite, lorsque `alert` essaie de lire la propriété `rabbit.eats` `(**)`, ce n'est pas dans `rabbit`, donc JavaScript suit la référence `[[Prototype]]` et la trouve dans `animal` (regarde de bas en haut) :
6060

@@ -129,8 +129,7 @@ Il n'y a que deux limitations :
129129
1. Les références ne peuvent pas tourner en rond. JavaScript va générer une erreur si nous essayons d'assigner `__proto__` dans un cercle.
130130
2. La valeur de `__proto__` peut être un objet ou `null`. Les autres types sont ignorés.
131131

132-
Cela peut aussi être évident, mais quand même: il ne peut y avoir qu'un seul `[[Prototype]]`. Un objet ne peut pas hériter de deux autres.
133-
132+
Cela peut aussi être évident, mais quand même : il ne peut y avoir qu'un seul `[[Prototype]]`. Un objet ne peut pas hériter de deux autres.
134133

135134
```smart header="`__proto__` est un getter/setter historique pour [[Prototype]]`"
136135
C'est une erreur courante des développeurs novices de ne pas connaître la différence entre les deux.
@@ -156,7 +155,7 @@ Dans l'exemple ci-dessous, nous affectons sa propre méthode `walk` à `rabbit`
156155
let animal = {
157156
eats: true,
158157
walk() {
159-
/* cette méthode ne sera pas utilisée par rabbit */
158+
/* cette méthode ne sera pas utilisée par rabbit */
160159
}
161160
};
162161
@@ -202,22 +201,22 @@ let admin = {
202201

203202
alert(admin.fullName); // John Smith (*)
204203

205-
// le mutateur se déclanche!
204+
// le mutateur se déclanche !
206205
admin.fullName = "Alice Cooper"; // (**)
207206

208-
alert(admin.fullName); // Alice Cooper, state of admin modified
209-
alert(user.fullName); // John Smith, state of user protected
207+
alert(admin.fullName); // Alice Cooper, l'état de admin est modifié
208+
alert(user.fullName); // John Smith, l'état de user est protégé
210209
```
211210

212-
Ici dans la ligne `(*)` la propriété `admin.fullName` a un accesseur dans le prototype `user`, donc c'est appelé. Et dans la ligne `(**)` la propriété a un mutateur dans le prototype, donc c'est appelé.
211+
Ici dans la ligne `(*)` la propriété `admin.fullName` a un accesseur dans le prototype `user`, il est donc appelé. Et dans la ligne `(**)` la propriété a un mutateur dans le prototype, il est donc appelé.
213212

214213
## La valeur de "this"
215214

216215
Une question intéressante peut se poser dans l'exemple ci-dessus : quelle est la valeur de `this` dans `set fullName(value)` ? Où sont écrites les propriétés `this.name` et `this.surname` : dans `user` ou `admin` ?
217216

218-
La réponse est simple: `this` n'est pas du tout affecté par les prototypes.
217+
La réponse est simple : `this` n'est pas du tout affecté par les prototypes.
219218

220-
**Peu importe où la méthode est trouvée: dans un objet ou son prototype. Dans un appel de méthode, `this` est toujours l'objet avant le point.**
219+
**Peu importe où la méthode est trouvée : dans un objet ou son prototype. Dans un appel de méthode, `this` est toujours l'objet avant le point.**
221220

222221
Ainsi, l'appel du groupe `admin.fullName=` utilise `admin` comme `this`, pas `user`.
223222

@@ -287,7 +286,7 @@ for(let prop in rabbit) alert(prop); // jumps, puis eats
287286
*/!*
288287
```
289288

290-
Si ce n'est pas ce que nous voulons et que nous aimerions exclure les propriétés héritées, il existe une méthode intégrée [obj.hasOwnProperty(key)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/hasOwnProperty): elle renvoie `true` si `obj` a sa propre propriété (non héritée) nommée `key`.
289+
Si ce n'est pas ce que nous voulons et que nous aimerions exclure les propriétés héritées, il existe une méthode intégrée [obj.hasOwnProperty(key)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/hasOwnProperty) : elle renvoie `true` si `obj` a sa propre propriété (non héritée) nommée `key`.
291290

292291
Nous pouvons donc filtrer les propriétés héritées (ou faire autre chose avec elles) :
293292

@@ -312,15 +311,15 @@ for(let prop in rabbit) {
312311
}
313312
```
314313

315-
Nous avons ici la chaîne d'héritage suivante: `rabbit` hérite de `animal`, qui lui hérite de `Object.prototype` (car `animal` est un objet littéral `{...}`, donc c'est par défaut), puis `null` au-dessus :
314+
Nous avons ici la chaîne d'héritage suivante : `rabbit` hérite de `animal`, qui lui hérite de `Object.prototype` (car `animal` est un objet littéral `{...}`, donc c'est par défaut), puis `null` au-dessus :
316315

317316
![](rabbit-animal-object.svg)
318317

319-
Remarque, il y a une chose amusante. D'où vient la méthode `rabbit.hasOwnProperty`? Nous ne l'avons pas défini. En regardant la chaîne, nous pouvons voir que la méthode est fournie par `Object.prototype.hasOwnProperty`. En d'autres termes, c'est hérité.
318+
Remarque, il y a une chose amusante. D'où vient la méthode `rabbit.hasOwnProperty` ? Nous ne l'avons pas défini. En regardant la chaîne, nous pouvons voir que la méthode est fournie par `Object.prototype.hasOwnProperty`. En d'autres termes, c'est hérité.
320319

321320
...Mais pourquoi `hasOwnProperty` n'apparaît pas dans la boucle `for..in`, comme `eats` et `jumps`, s'il répertorie toutes les propriétés héritées.
322321

323-
La réponse est simple: ce n'est pas énumérable. Comme toutes les autres propriétés de `Object.prototype`, il possède l'attribut `enumerable: false`. C'est pourquoi ils ne sont pas répertoriés. Et `for..in` ne répertorie que les propriétés énumérables. C'est pourquoi elle et le reste des propriétés `Object.prototype` ne sont pas listés.
322+
La réponse est simple : ce n'est pas énumérable. Comme toutes les autres propriétés de `Object.prototype`, il possède l'attribut `enumerable: false`. C'est pourquoi ils ne sont pas répertoriés. Et `for..in` ne répertorie que les propriétés énumérables. C'est pourquoi elle et le reste des propriétés `Object.prototype` ne sont pas listés.
324323

325324
```smart header="Presque toutes les autres méthodes d'obtention de clé/valeur ignorent les propriétés héritées"
326325
Presque toutes les autres méthodes d'obtention de clé/valeur, telles que `Object.keys`, `Object.values` et ainsi de suite ignorent les propriétés héritées.

0 commit comments

Comments
 (0)