Skip to content

Commit ae9d921

Browse files
authored
Merge pull request #468 from ArmandDelessert/patch-1-js-09-classes-2
Apporte plusieurs corrections aux parties 5 à 7 du chapitre 1.9 (Classes)
2 parents 9b2a73d + ad7e49a commit ae9d921

File tree

4 files changed

+69
-67
lines changed

4 files changed

+69
-67
lines changed

1-js/09-classes/05-extend-natives/article.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
Les classes intégrées telles que Array, Map et autres sont également extensibles.
55

6-
Par exemple, ici, `PowerArray` hérite du `Array` natif:
6+
Par exemple, ici, `PowerArray` hérite du `Array` natif :
77

88
```js run
99
// ajoutez-y une méthode supplémentaire
@@ -24,6 +24,7 @@ alert(filteredArr.isEmpty()); // false
2424
Notez une chose très intéressante. Les méthodes intégrées telles que `filter`, `map` et autres renvoient des nouveaux objets exactement du type hérité `PowerArray`. Leur implémentation interne utilise la propriété d'objet `constructor` pour cela.
2525

2626
Dans l'exemple ci-dessus,
27+
2728
```js
2829
arr.constructor === PowerArray
2930
```
@@ -34,7 +35,7 @@ Encore plus, nous pouvons personnaliser ce comportement.
3435

3536
Nous pouvons ajouter un accésseur statique spécial `Symbol.species` à la classe. S'il existe, il devrait renvoyer le constructeur que JavaScript utilisera en interne pour créer de nouvelles entités dans `map`, `filter`, etc.
3637

37-
Si nous souhaitons que des méthodes intégrées comme `map` ou `filter` renvoient des tableaux classiques, nous pouvons retourner `Array` dans `Symbol.species`, comme ici:
38+
Si nous souhaitons que des méthodes intégrées comme `map` ou `filter` renvoient des tableaux classiques, nous pouvons retourner `Array` dans `Symbol.species`, comme ici :
3839

3940
```js run
4041
class PowerArray extends Array {
@@ -57,7 +58,7 @@ alert(arr.isEmpty()); // false
5758
let filteredArr = arr.filter(item => item >= 10);
5859

5960
*!*
60-
// filteredArr n'est pas PowerArray, mais Array
61+
// filteredArr n'est pas un PowerArray, mais un Array
6162
*/!*
6263
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
6364
```
@@ -70,17 +71,17 @@ D'autres collections, telles que `Map` et `Set`, fonctionnent de la même maniè
7071

7172
## Pas d'héritage statique dans les éléments intégrés
7273

73-
Les objets intégrés ont leurs propres méthodes statiques, par exemple `Object.keys`,` Array.isArray` etc.
74+
Les objets intégrés ont leurs propres méthodes statiques, par exemple `Object.keys`, `Array.isArray`, etc.
7475

75-
Comme nous le savons déjà, les classes natives s'étendent les uns des autres. Par exemple, `Array` extends `Object`.
76+
Comme nous le savons déjà, les classes natives s'étendent les uns des autres. Par exemple, `Array` étend (hérite de) `Object`.
7677

7778
Normalement, lorsqu'une classe en étend une autre, les méthodes statiques et non statiques sont héritées. Cela a été expliqué en détail dans le chapitre [](info:static-properties-methods#statics-and-inheritance).
7879

79-
Mais les classes intégrées sont une exception. Ils n'héritent pas les méthodes statiques les uns des autres.
80+
Mais les classes intégrées sont une exception. Elles n'héritent pas des méthodes statiques les unes des autres.
8081

8182
Par exemple, `Array` et `Date` héritent de `Object`, de sorte que leurs instances ont des méthodes issues de `Object.prototype`. Mais `Array.[[Prototype]]` ne fait pas référence à `Object`, il n'y a donc pas, par exemple, de méthode statique `Array.keys()` (ou `Date.keys()`).
8283

83-
Voici la structure d'image pour `Date` et `Object`:
84+
Voici le schéma la structure pour `Date` et `Object` :
8485

8586
![](object-date-inheritance.svg)
8687

1-js/09-classes/06-instanceof/article.md

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
1-
# Vérification de classe: "instanceof"
1+
# Vérification de classe : "instanceof"
22

33
L'opérateur `instanceof` permet de vérifier si un objet appartient à une certaine classe. Il prend également en compte l'héritage.
44

55
Une telle vérification peut être nécessaire dans de nombreux cas. Nous l'utilisons ici pour construire une fonction *polymorphique*, celle qui traite les arguments différemment en fonction de leur type.
66

77
## L'opérateur instanceof [#ref-instanceof]
88

9-
La syntaxe est la suivante:
9+
La syntaxe est la suivante :
10+
1011
```js
1112
obj instanceof Class
1213
```
1314

1415
Cela renvoie `true` si `obj` appartient à la `Class` ou à une classe qui en hérite.
1516

16-
Par exemple:
17+
Par exemple :
1718

1819
```js run
1920
class Rabbit {}
2021
let rabbit = new Rabbit();
2122

22-
// est-ce un objet de la classe Rabbit?
23+
// est-ce un objet de la classe Rabbit ?
2324
*!*
2425
alert( rabbit instanceof Rabbit ); // true
2526
*/!*
2627
```
2728

28-
Cela fonctionne aussi avec les fonctions constructeur:
29+
Cela fonctionne aussi avec les fonctions constructeur :
2930

3031
```js run
3132
*!*
@@ -36,7 +37,7 @@ function Rabbit() {}
3637
alert( new Rabbit() instanceof Rabbit ); // true
3738
```
3839

39-
...Et avec des classes intégrées comme `Array`:
40+
...Et avec des classes intégrées comme `Array` :
4041

4142
```js run
4243
let arr = [1, 2, 3];
@@ -48,14 +49,14 @@ Veuillez noter que `arr` appartient également à la classe `Object`. C'est parc
4849

4950
Normalement, l’opérateur `instanceof` examine la chaîne prototypale pour la vérification. Nous pouvons également définir une logique personnalisée dans la méthode statique `Symbol.hasInstance`.
5051

51-
L'algorithme de `obj instanceof Class` fonctionne à peu près comme suit:
52+
L'algorithme de `obj instanceof Class` fonctionne à peu près comme suit :
5253

53-
1. S'il existe une méthode statique `Symbol.hasInstance`, appelez-la simplement: `Class[Symbol.hasInstance](obj)`. Cela devrait renvoyer `true` ou `false`, et nous avons terminé. C'est ainsi que nous pouvons personnaliser le comportement de `instanceof`.
54+
1. S'il existe une méthode statique `Symbol.hasInstance`, appelez-la simplement : `Class[Symbol.hasInstance](obj)`. Cela devrait renvoyer `true` ou `false`, et nous avons terminé. C'est ainsi que nous pouvons personnaliser le comportement de `instanceof`.
5455

55-
     Par exemple:
56+
     Par exemple :
5657

5758
```js run
58-
// configuration du contrôle de instanceOf qui suppose que
59+
// configuration du contrôle de instanceof qui suppose que
5960
// tout ce qui a la propriété canEat est un animal
6061
class Animal {
6162
static [Symbol.hasInstance](obj) {
@@ -68,9 +69,10 @@ let obj = { canEat: true };
6869
alert(obj instanceof Animal); // true: Animal[Symbol.hasInstance](obj) est appelée
6970
```
7071

71-
2. La plupart des classes n'ont pas `Symbol.hasInstance`. Dans ce cas, la logique standard est utilisée: `obj instanceOf Class` vérifie si `Class.prototype` est égale à l'un des prototypes de la chaîne prototypale `obj`.
72+
2. La plupart des classes n'ont pas `Symbol.hasInstance`. Dans ce cas, la logique standard est utilisée : `obj instanceof Class` vérifie si `Class.prototype` est égale à l'un des prototypes de la chaîne prototypale `obj`.
73+
74+
En d'autres termes, on compare l'un après l'autre :
7275

73-
En d'autres termes, comparez les uns après les autres:
7476
```js
7577
obj.__proto__ === Class.prototype?
7678
obj.__proto__.__proto__ === Class.prototype?
@@ -82,7 +84,7 @@ obj.__proto__.__proto__.__proto__ === Class.prototype?
8284
8385
Dans l'exemple ci-dessus, `rabbit.__ proto__ === Rabbit.prototype`, donne donc la réponse immédiatement.
8486
85-
     Dans le cas d'un héritage, le match sera à la deuxième étape:
87+
Dans le cas d'un héritage, la correspondance se fera à la deuxième étape :
8688
8789
```js run
8890
class Animal {}
@@ -93,23 +95,23 @@ let rabbit = new Rabbit();
9395
alert(rabbit instanceof Animal); // true
9496
*/!*
9597

96-
// rabbit.__proto__ === Animal.prototype (no match)
98+
// rabbit.__proto__ === Animal.prototype (pas de correspondance)
9799
*!*
98-
// rabbit.__proto__.__proto__ === Animal.prototype (match!)
100+
// rabbit.__proto__.__proto__ === Animal.prototype (ça correspond!)
99101
*/!*
100102
```
101103
102-
Voici l'illustration de ce que `rabbit instanceof Animal` compare avec `Animal.prototype`:
104+
Voici l'illustration de ce que `rabbit instanceof Animal` compare avec `Animal.prototype` :
103105
104106
![](instanceof.svg)
105107
106-
À propos, il y a aussi une méthode [objA.isPrototypeOf(objB)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/isPrototypeOf), qui renvoie `true` si `objA` se trouve quelque part dans la chaîne de prototypes pour `objB`. Ainsi, le test de `obj instanceof Class` peut être reformulé comme suit: `Class.prototype.isPrototypeOf(obj) `.
108+
À propos, il y a aussi une méthode [objA.isPrototypeOf(objB)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/isPrototypeOf), qui renvoie `true` si `objA` se trouve quelque part dans la chaîne de prototypes pour `objB`. Ainsi, le test de `obj instanceof Class` peut être reformulé comme suit : `Class.prototype.isPrototypeOf(obj)`.
107109
108-
C'est drôle, mais le constructeur `Class` lui-même ne participe pas au contrôle! Seule la chaîne de prototypes et `Class.prototype` compte.
110+
C'est drôle, mais le constructeur `Class` lui-même ne participe pas au contrôle ! Seule la chaîne de prototypes et `Class.prototype` compte.
109111
110-
Cela peut avoir des conséquences intéressantes lorsque une propriété `prototype` est modifiée après la création de l'objet.
112+
Cela peut avoir des conséquences intéressantes lorsqu'une propriété `prototype` est modifiée après la création de l'objet.
111113
112-
Comme ici:
114+
Comme ici :
113115
114116
```js run
115117
function Rabbit() {}
@@ -118,15 +120,15 @@ let rabbit = new Rabbit();
118120
// le prototype est changé
119121
Rabbit.prototype = {};
120122

121-
// ...plus un rabbit!
123+
// ...plus un rabbit !
122124
*!*
123125
alert( rabbit instanceof Rabbit ); // false
124126
*/!*
125127
```
126128
127-
## Bonus: Object.prototype.toString pour le type
129+
## Bonus : Object.prototype.toString pour le type
128130
129-
Nous savons déjà que les objets simples sont convertis en chaîne sous la forme `[objet Objet]`:
131+
Nous savons déjà que les objets simples sont convertis en chaîne sous la forme `[objet Objet]` :
130132
131133
```js run
132134
let obj = {};
@@ -137,32 +139,32 @@ alert(obj.toString()); // la même chose
137139
138140
C'est leur implémentation de `toString`. Mais il existe une fonctionnalité cachée qui rend `toString` beaucoup plus puissant que cela. Nous pouvons l'utiliser comme un `typeof` étendu et une alternative pour `instanceof`.
139141
140-
Cela semble étrange? Effectivement. Démystifions.
142+
Cela semble étrange ? Effectivement. Démystifions.
141143
142144
Par [spécification](https://tc39.github.io/ecma262/#sec-object.prototype.tostring), le `toString` intégré peut être extrait de l'objet et exécuté dans le contexte de toute autre valeur. Et son résultat dépend de cette valeur.
143145
144146
- Pour un nombre, ce sera `[object Number]`
145147
- Pour un booléen, ce sera `[object Boolean]`
146-
- Pour `null`: `[objet Null]`
147-
- Pour `undefined`: `[objet Undefined]`
148-
- Pour les tableaux: `[objet Array]`
149-
- ... etc (personnalisable).
148+
- Pour `null` : `[objet Null]`
149+
- Pour `undefined` : `[objet Undefined]`
150+
- Pour les tableaux : `[objet Array]`
151+
- ... etc. (personnalisable).
150152
151-
Montrons cela:
153+
Montrons cela :
152154
153155
```js run
154156
// copier la méthode toString dans une variable pour plus d'utilité
155157
let objectToString = Object.prototype.toString;
156158

157-
// quel type est-ce?
159+
// quel type est-ce ?
158160
let arr = [];
159161

160162
alert( objectToString.call(arr) ); // [object *!*Array*/!*]
161163
```
162164
163-
Ici nous avons utilisé [call](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/call) comme décrit dans le chapitre [](info:call-apply-decorators) exécuter la fonction `objectToString` dans le contexte `this=arr`.
165+
Ici nous avons utilisé [call](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/call) comme décrit dans le chapitre [](info:call-apply-decorators) pour exécuter la fonction `objectToString` dans le contexte `this=arr`.
164166
165-
En interne, l'algorithme `toString` examine `this` et renvoie le résultat correspondant. Plus d'exemples:
167+
En interne, l'algorithme `toString` examine `this` et renvoie le résultat correspondant. Plus d'exemples :
166168
167169
```js run
168170
let s = Object.prototype.toString;
@@ -176,7 +178,7 @@ alert( s.call(alert) ); // [object Function]
176178
177179
Le comportement de Object `toString` peut être personnalisé à l'aide d'une propriété d'objet spéciale `Symbol.toStringTag`.
178180
179-
Par exemple:
181+
Par exemple :
180182
181183
```js run
182184
let user = {
@@ -199,19 +201,19 @@ alert( {}.toString.call(new XMLHttpRequest()) ); // [object XMLHttpRequest]
199201
200202
Comme vous pouvez le constater, le résultat est exactement `Symbol.toStringTag` (s'il existe), encapsulé dans `[objet ...]`.
201203
202-
À la fin, nous avons "typeof sur stéroïdes" qui fonctionne non seulement pour les types de données primitifs, mais aussi pour les objets intégrés et peut même être personnalisé.
204+
Au final, nous avons un "typeof sous stéroïdes" qui fonctionne non seulement pour les types de données primitifs, mais aussi pour les objets intégrés et qui peut même être personnalisé.
203205
204-
Nous pouvons utiliser `{}.toString.call` au lieu de `instanceof` pour les objets intégrés lorsque nous voulons obtenir le type sous forme de chaîne plutôt que simplement pour vérifier.
206+
Nous pouvons utiliser `{}.toString.call` au lieu de `instanceof` pour les objets intégrés lorsque nous voulons obtenir le type sous forme de chaîne de caractères plutôt que pour simplement vérifier.
205207
206208
## Résumé
207209
208-
Résumons les méthodes de vérification de type que nous connaissons:
210+
Résumons les méthodes de vérification de type que nous connaissons :
209211
210-
| | fonctionne pour | renvoie |
211-
|---------------|-------------|---------------|
212-
| `typeof` | primitives | string |
213-
| `{}.toString` | primitives, objets intégrés, objets avec `Symbol.toStringTag` | string |
214-
| `instanceof` | objects | true/false |
212+
| | fonctionne pour | renvoie |
213+
|---------------|---------------------------------------------------------------|------------|
214+
| `typeof` | primitives | string |
215+
| `{}.toString` | primitives, objets intégrés, objets avec `Symbol.toStringTag` | string |
216+
| `instanceof` | objects | true/false |
215217
216218
Comme on peut le constater, `{}.toString` est techniquement un `typeof` "plus avancé".
217219

0 commit comments

Comments
 (0)