You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/08-prototypes/01-prototype-inheritance/article.md
+10-11Lines changed: 10 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -47,14 +47,14 @@ let rabbit = {
47
47
rabbit.__proto__= animal; // (*)
48
48
*/!*
49
49
50
-
// nous pouvons maintenant trouver les deux propriétés dans rabbit:
50
+
// nous pouvons maintenant trouver les deux propriétés dans rabbit:
51
51
*!*
52
52
alert( rabbit.eats ); // true (**)
53
53
*/!*
54
54
alert( rabbit.jumps ); // true
55
55
```
56
56
57
-
Ici, la ligne `(*)` définit `animal` pour être un prototype de`lapin`.
57
+
Ici, la ligne `(*)` définit `animal` pour être un prototype de`lapin`.
58
58
59
59
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) :
60
60
@@ -129,8 +129,7 @@ Il n'y a que deux limitations :
129
129
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.
130
130
2. La valeur de `__proto__` peut être un objet ou `null`. Les autres types sont ignorés.
131
131
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.
134
133
135
134
```smart header="`__proto__` est un getter/setter historique pour [[Prototype]]`"
136
135
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`
156
155
let animal = {
157
156
eats: true,
158
157
walk() {
159
-
/* cette méthode ne sera pas utilisée par rabbit */
158
+
/* cette méthode ne sera pas utilisée par rabbit */
160
159
}
161
160
};
162
161
@@ -215,9 +214,9 @@ Ici dans la ligne `(*)` la propriété `admin.fullName` a un accesseur dans le p
215
214
216
215
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` ?
217
216
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.
219
218
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.**
221
220
222
221
Ainsi, l'appel du groupe `admin.fullName=` utilise `admin` comme `this`, pas `user`.
223
222
@@ -287,7 +286,7 @@ for(let prop in rabbit) alert(prop); // jumps, puis eats
287
286
*/!*
288
287
```
289
288
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`.
291
290
292
291
Nous pouvons donc filtrer les propriétés héritées (ou faire autre chose avec elles) :
293
292
@@ -312,15 +311,15 @@ for(let prop in rabbit) {
312
311
}
313
312
```
314
313
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 :
316
315
317
316

318
317
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é.
320
319
321
320
...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.
322
321
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.
324
323
325
324
```smart header="Presque toutes les autres méthodes d'obtention de clé/valeur ignorent les propriétés héritées"
326
325
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