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
Lorsque nous créons une propriété à l'aide d'un descripteur, ses indicateurs sont `false` par défaut. Donc, dans le code ci-dessus, `dictionary.toString` est non énumérable.
30
30
31
-
<<<<<<< HEAD
32
31
Voir le chapitre [](info:property-descriptors) pour revoir.
33
-
=======
34
-
See the chapter [](info:property-descriptors) for review.
Dans le premier chapitre de cette section, nous avons indiqué qu'il existe des méthodes modernes pour configurer un prototype.
5
5
6
-
<<<<<<< HEAD
7
-
Le `__proto__` est considéré comme dépassée et quelque peu obsolète (dans la partie de la norme JavaScript réservée au navigateur).
6
+
La définition ou la lecture du prototype avec `obj.__proto__` est considérée comme obsolète et dépréciée (déplacée dans la soi-disant "annexe B" de la norme JavaScript, destinée uniquement aux navigateurs).
8
7
9
-
Les méthodes modernes sont:
8
+
Les méthodes modernes pour obtenir/définir un prototype sont:
10
9
11
-
-[Object.create(proto, [descriptors])](mdn:js/Object/create) -- crée un objet vide avec un `proto` donné en tant que `[[Prototype]]` et des descripteurs de propriété facultatifs.
12
-
-[Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- retourne le `[[Prototype]]` of `obj`.
13
-
-[Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- configure le `[[Prototype]]` de `obj` à `proto`.
10
+
-[Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- retourn le `[[Prototype]]` de `obj`.
11
+
-[Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- configure le `[[Prototype]]` de `obj` à `proto`.
14
12
15
-
Ceux-ci devraient être utilisés à la place de `__proto__`.
16
-
=======
17
-
Setting or reading the prototype with `obj.__proto__` is considered outdated and somewhat deprecated (moved to the so-called "Annex B" of the JavaScript standard, meant for browsers only).
13
+
La seule utilisation de `__proto__`, qui n'est pas mal vue, est en tant que propriété lors de la création d'un nouvel objet : `{ __proto__: ... }`.
18
14
19
-
The modern methods to get/set a prototype are:
15
+
Bien qu'il existe également une méthode spéciale pour cela :
20
16
21
-
-[Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- returns the `[[Prototype]]` of `obj`.
22
-
-[Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- sets the `[[Prototype]]` of `obj` to `proto`.
23
-
24
-
The only usage of `__proto__`, that's not frowned upon, is as a property when creating a new object: `{ __proto__: ... }`.
25
-
26
-
Although, there's a special method for this too:
27
-
28
-
-[Object.create(proto, [descriptors])](mdn:js/Object/create) -- creates an empty object with given `proto` as `[[Prototype]]` and optional property descriptors.
29
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
17
+
-[Object.create(proto, [descriptors])](mdn:js/Object/create) -- crée un objet vide avec `proto` donné comme `[[Prototype]]` et des descripteurs de propriété facultatifs.
30
18
31
19
Par exemple:
32
20
@@ -51,13 +39,9 @@ Object.setPrototypeOf(rabbit, {}); // change le prototype de rabbit en {}
51
39
*/!*
52
40
```
53
41
54
-
<<<<<<< HEAD
55
-
`Object.create` a un deuxième argument facultatif: les descripteurs de propriété. Nous pouvons fournir des propriétés supplémentaires au nouvel objet, comme ceci:
56
-
=======
57
-
The `Object.create` method is a bit more powerful, as it has an optional second argument: property descriptors.
42
+
La méthode `Object.create` est un peu plus puissante, car elle a un deuxième argument facultatif : les descripteurs de propriété.
58
43
59
-
We can provide additional properties to the new object there, like this:
60
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
44
+
Nous pouvons fournir des propriétés supplémentaires au nouvel objet, comme ceci:
61
45
62
46
```js run
63
47
let animal = {
@@ -85,45 +69,27 @@ let clone = Object.create(
85
69
86
70
Cet appel crée une copie véritablement exacte de `obj`, y compris de toutes les propriétés: énumérable et non, des propriétés de données et des accesseurs/mutateurs - tout, et avec le bon `[[Prototype]]`.
87
71
88
-
<<<<<<< HEAD
89
72
## Bref historique
90
73
91
-
Si on compte tous les moyens de gérer `[[Prototype]]`, il y en a beaucoup! De nombreuses façons de faire la même chose !
92
-
93
-
Pourquoi ?
94
-
=======
95
-
96
-
## Brief history
74
+
Il y a tellement de façons de gérer `[[Prototype]]`. Comment est-ce arrivé ? Pourquoi ?
97
75
98
-
There're so many ways to manage `[[Prototype]]`. How did that happen? Why?
99
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
100
76
101
77
C'est pour des raisons historiques.
102
78
103
-
<<<<<<< HEAD
104
-
- La propriété `"prototype"` d'une fonction constructeur fonctionne depuis très longtemps.
105
-
- Plus tard dans l'année 2012 : `Object.create` est apparu dans le standard. Cela permettait de créer des objets avec le prototype donné, mais ne permettait pas d'y accéder/muter. Les navigateurs ont donc implémenté un accesseur non standard `__proto__` qui permettait d'accéder/muter un prototype à tout moment.
106
-
- Plus tard, dans l'année 2015 : `Object.setPrototypeOf` et `Object.getPrototypeOf` ont été ajoutés dans le standard pour exécuter la même fonctionnalité que `__proto__`. Comme `__proto__` était implémenté de facto partout, il était en quelque sorte obsolète et passait à l'Annexe B de la norme, qui est facultative pour les environnements autres que les navigateurs.
79
+
L'héritage prototypal était dans la langue depuis son aube, mais les façons de le gérer ont évolué au fil du temps.
107
80
108
-
Pour l'instant, nous avons tous ces moyens à notre disposition.
81
+
- La propriété `prototype` d'une fonction constructeur fonctionne depuis des temps très anciens. C'est la manière la plus ancienne de créer des objets avec un prototype donné.
82
+
- Plus tard, en 2012, `Object.create` est apparu dans la norme. Il a donné la possibilité de créer des objets avec un prototype donné, mais n'a pas fourni la possibilité de l'obtenir/le définir. Certains navigateurs ont implémenté l'accesseur non standard `__proto__` qui permettait à l'utilisateur d'obtenir/définir un prototype à tout moment, pour donner plus de flexibilité aux développeurs.
83
+
- Plus tard, en 2015, `Object.setPrototypeOf` et `Object.getPrototypeOf` ont été ajoutés à la norme, pour exécuter la même fonctionnalité que `__proto__`. Comme `__proto__` était de facto implémenté partout, il était en quelque sorte obsolète et a fait son chemin vers l'annexe B de la norme, c'est-à-dire: facultatif pour les environnements sans navigateur.
84
+
- Plus tard, en 2022, il a été officiellement autorisé à utiliser `__proto__` dans les objets littéraux `{...}` (supprimés de l'annexe B), mais pas en tant que getter/setter `obj.__proto__` (toujours dans Annexe B).
109
85
110
-
Pourquoi `__proto__` a-t-il été remplacé par les fonctions `getPrototypeOf/setPrototypeOf`? C'est une question intéressante, qui nous oblige à comprendre pourquoi `__proto__` est mauvais. Lisez la suite pour obtenir la réponse.
111
-
=======
112
-
The prototypal inheritance was in the language since its dawn, but the ways to manage it evolved over time.
86
+
Pourquoi `__proto__` a été remplacé par les fonctions `getPrototypeOf/setPrototypeOf` ?
113
87
114
-
- The `prototype` property of a constructor function has worked since very ancient times. It's the oldest way to create objects with a given prototype.
115
-
- Later, in the year 2012, `Object.create` appeared in the standard. It gave the ability to create objects with a given prototype, but did not provide the ability to get/set it. Some browsers implemented the non-standard `__proto__` accessor that allowed the user to get/set a prototype at any time, to give more flexibility to developers.
116
-
- Later, in the year 2015, `Object.setPrototypeOf` and `Object.getPrototypeOf` were added to the standard, to perform the same functionality as `__proto__`. As `__proto__` was de-facto implemented everywhere, it was kind-of deprecated and made its way to the Annex B of the standard, that is: optional for non-browser environments.
117
-
- Later, in the year 2022, it was officially allowed to use `__proto__` in object literals `{...}` (moved out of Annex B), but not as a getter/setter `obj.__proto__` (still in Annex B).
88
+
Pourquoi `__proto__` a-t-il été partiellement réhabilité et son utilisation autorisée dans `{...}`, mais pas en tant que getter/setter ?
118
89
119
-
Why was `__proto__` replaced by the functions `getPrototypeOf/setPrototypeOf`?
90
+
C'est une question intéressante, qui nous oblige à comprendre pourquoi `__proto__` est mauvais.
120
91
121
-
Why was `__proto__` partially rehabilitated and its usage allowed in `{...}`, but not as a getter/setter?
122
-
123
-
That's an interesting question, requiring us to understand why `__proto__` is bad.
124
-
125
-
And soon we'll get the answer.
126
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
92
+
Et bientôt nous aurons la réponse.
127
93
128
94
```warn header="Ne changez pas `[[Prototype]]` sur des objets existants si la vitesse est importante"
129
95
Techniquement, nous pouvons accéder/muter `[[Prototype]]` à tout moment. Mais en général, nous ne le définissons qu’une fois au moment de la création de l’objet, puis nous ne modifions pas : `rabbit` hérite de `animal`, et cela ne changera pas.
@@ -148,58 +114,36 @@ obj[key] = "some value";
148
114
alert(obj[key]); // [object Object], pas "some value"!
149
115
```
150
116
151
-
<<<<<<< HEAD
152
-
Ici, si l'utilisateur tape `__proto__`, l'assignation est ignorée!
117
+
Ici, si l'utilisateur tape `__proto__`, l'assignation à la ligne 4 est ignorée!
153
118
154
-
Cela ne devrait pas nous surprendre. La propriété `__proto__` est spéciale: elle doit être un objet ou` null`. Une chaîne de caractères ne peut pas devenir un prototype.
155
-
=======
156
-
Here, if the user types in `__proto__`, the assignment in line 4 is ignored!
157
-
158
-
That could surely be surprising for a non-developer, but pretty understandable for us. The `__proto__` property is special: it must be either an object or `null`. A string can not become a prototype. That's why an assignment a string to `__proto__` is ignored.
159
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
119
+
Cela pourrait sûrement être surprenant pour un non-développeur, mais assez compréhensible pour nous. La propriété `__proto__` est spéciale : elle doit être soit un objet, soit `null`. Une chaîne de caractères ne peut pas devenir un prototype. C'est pourquoi une affectation d'une chaîne à `__proto__` est ignorée.
160
120
161
121
Mais nous n'avions pas * l'intention * de mettre en œuvre un tel comportement, non? Nous voulons stocker des paires clé / valeur, et la clé nommée `"__proto __"` n'a pas été correctement enregistrée. Donc c'est un bug!
162
122
163
-
<<<<<<< HEAD
164
-
Ici les conséquences ne sont pas terribles. Mais dans d'autres cas, nous pouvons attribuer des valeurs d'objet, le prototype peut en effet être modifié. En conséquence, l'exécution se déroulera de manière totalement inattendue.
165
-
=======
166
-
Here the consequences are not terrible. But in other cases we may be storing objects instead of strings in `obj`, and then the prototype will indeed be changed. As a result, the execution will go wrong in totally unexpected ways.
167
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
123
+
Ici les conséquences ne sont pas terribles. Mais dans d'autres cas, nous pouvons stocker des objets au lieu de chaînes dans `obj`, puis le prototype sera effectivement modifié. En conséquence, l'exécution ira mal de manière totalement inattendue.
168
124
169
125
Ce qui est pire -- généralement les développeurs ne pensent pas du tout à cette possibilité. Cela rend ces bugs difficiles à remarquer et même à les transformer en vulnérabilités, en particulier lorsque JavaScript est utilisé côté serveur.
170
126
171
-
<<<<<<< HEAD
172
-
Des choses inattendues peuvent également se produire lors de l'attribution à `toString`, qui est une fonction par défaut, et d'autres méthodes intégrées.
173
-
=======
174
-
Unexpected things also may happen when assigning to `obj.toString`, as it's a built-in object method.
175
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
127
+
Des choses inattendues peuvent également se produire lors de l'affectation à `obj.toString`, car il s'agit d'une méthode d'objet intégrée.
176
128
177
129
Comment pouvons-nous éviter ce problème ?
178
130
179
-
<<<<<<< HEAD
180
131
Tout d'abord, nous pouvons simplement passer à l'utilisation de `Map` pour le stockage au lieu d'objets simples, puis tout va bien.
181
132
182
-
Mais `Object` peut également bien nous servir ici, car les créateurs du langage ont réfléchi à ce problème il y a longtemps.
183
-
184
-
`__proto__` n'est pas une propriété d'un objet, mais un accesseur de propriété de `Object.prototype`:
185
-
=======
186
-
First, we can just switch to using `Map` for storage instead of plain objects, then everything's fine:
Les méthodes modernes pour configurer et accéder directement au prototype sont les suivantes :
259
-
260
-
-[Object.create(proto, [descriptors])](mdn:js/Object/create) -- crée un objet vide avec un `proto` donné en tant que `[[Prototype]]` (peut être `null`) et des descripteurs de propriété facultatifs.
261
-
-[Object.getPrototypeOf(obj)](mdn:js/Object.getPrototypeOf) -- retourne le `[[Prototype]]` de `obj` (identique au getter `__proto__`).
262
-
-[Object.setPrototypeOf(obj, proto)](mdn:js/Object.setPrototypeOf) -- configure le `[[Prototype]]` de `obj` à `proto` (identique au setter `__proto__`).
263
-
264
-
Le getter/setter `__proto__` intégré est dangereux si nous souhaitons placer les clés générées par l'utilisateur dans un objet. Tout simplement parce qu'un utilisateur peut entrer `"__proto __"` comme clé, et il y aura une erreur, avec des conséquences légères, espérons-le, mais généralement imprévisibles.
265
-
266
-
Nous pouvons donc utiliser `Object.create(null)` pour créer un objet "très simple" sans `"__proto__"` ou nous en tenir à des objets `Map` pour cela.
267
-
268
-
En outre, `Object.create` fournit un moyen simple de copier superficiellement un objet avec tous les descripteurs:
269
-
=======
270
-
- To create an object with the given prototype, use:
201
+
- Pour créer un objet avec le prototype donné, utilisez :
-or[Object.create(proto, [descriptors])](mdn:js/Object/create), allows to specify property descriptors.
203
+
-syntaxe littérale : `{ __proto__: ... }`, permet de spécifier plusieurs propriétés
204
+
-ou[Object.create(proto, [descriptors])](mdn:js/Object/create), permet de spécifier des descripteurs de propriété.
274
205
275
-
The`Object.create`provides an easy way to shallow-copy an object with all descriptors:
206
+
Le`Object.create`fournit un moyen simple de copier superficiellement un objet avec tous les descripteurs :
276
207
277
208
```js
278
209
let clone =Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
279
210
```
280
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
281
-
282
-
- Modern methods to get/set the prototype are:
283
-
284
-
<<<<<<<HEAD
285
-
Nous avons également précisé que `__proto__` est un accésseur/mutateur pour `[[Prototype]]` et réside dans `Object.prototype`, tout comme les autres méthodes.
286
-
287
-
Nous pouvons créer un objet sans prototype avec `Object.create(null)`. De tels objets sont utilisés comme "dictionnaires purs", ils n'ont aucun problème avec `"__proto __"` comme clé.
288
-
289
-
Autres méthodes:
290
211
291
-
- [Object.keys(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/keys) / [Object.values(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/values) / [Object.entries(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/entries) -- retourne un tableau de paires nom / propriété / clé-valeur de propriété de chaîne de caractères énumérable.
292
-
- [Object.getOwnPropertySymbols(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/getOwnPropertySymbols) -- renvoie un tableau de toutes les clés symboliques.
293
-
- [ ] [Object.getOwnPropertyNames(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/getOwnPropertyNames) -- renvoie un tableau de toutes les clés de chaîne de caractères.
294
-
- [Reflect.ownKeys(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Reflect/ownKeys) -- renvoie un tableau de toutes les clés.
295
-
- [obj.hasOwnProperty(key)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/hasOwnProperty): renvoie `true` si `obj` a sa propre clé (non héritée) appelée `key`.
212
+
- Les méthodes modernes pour obtenir/définir le prototype sont :
296
213
297
-
Toutes les méthodes qui renvoient des propriétés d'objet (comme `Object.keys` et autres) - renvoient leurs propres propriétés. Si nous voulons les hérités, alors nous pouvons utiliser `for..in`.
298
-
=======
299
-
- [Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- returns the `[[Prototype]]`of`obj` (same as `__proto__` getter).
300
-
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- sets the `[[Prototype]]`of`obj` to `proto` (same as `__proto__` setter).
214
+
- [Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- renvoie le `[[Prototype]]` de `obj` (identique au getter `__proto__`).
215
+
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- définit le `[[Prototype]]` de `obj` à `proto` (identique au setter `__proto__`).
301
216
302
-
-Getting/setting the prototype using the built-in`__proto__`getter/setter isn't recommended, it's now in the Annex Bof the specification.
217
+
-Obtenir/définir le prototype en utilisant le getter/setter intégré `__proto__` n'est pas recommandé, c'est maintenant dans l'annexe B de la spécification.
303
218
304
-
-We also covered prototype-less objects, created with`Object.create(null)`or`{__proto__: null}`.
219
+
- Nous avons également couvert les objets sans prototype, créés avec `Object.create(null)` ou `{__proto__: null}`.
305
220
306
-
These objects are used as dictionaries, to store any (possibly user-generated) keys.
221
+
Ces objets sont utilisés comme dictionnaires, pour stocker toutes les clés (éventuellement générées par l'utilisateur).
307
222
308
-
Normally, objects inherit built-in methods and `__proto__` getter/setter from `Object.prototype`, making corresponding keys "occupied" and potentially causing side effects. With`null` prototype, objects are truly empty.
309
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
223
+
Normalement, les objets héritent des méthodes intégrées et du getter/setter `__proto__` de `Object.prototype`, rendant les clés correspondantes "occupées" et provoquant potentiellement des effets secondaires. Avec le prototype "null", les objets sont vraiment vides.
0 commit comments