Skip to content

Commit 32ad17f

Browse files
authored
Merge pull request #64 from TevaHenry/master
Property flags and descriptors
2 parents 8ccbc88 + 2f407c4 commit 32ad17f

File tree

2 files changed

+77
-77
lines changed

2 files changed

+77
-77
lines changed
Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11

2-
# Property flags and descriptors
2+
# Attributs et descripteurs de propriétés
33

4-
As we know, objects can store properties.
4+
Comme nous le savons, les objets peuvent stocker des propriétés.
55

6-
Till now, a property was a simple "key-value" pair to us. But an object property is actually a more flexible and powerful thing.
6+
Jusqu'à présent, une propriété était pour nous une simple paire "clé-valeur". Mais une propriété d'objet est en réalité une chose plus flexible et plus puissante.
77

8-
In this chapter we'll study additional configuration options, and in the next we'll see how to invisibly turn them into getter/setter functions.
8+
Dans ce chapitre, nous étudierons des options de configuration supplémentaires et, dans le prochain, nous verrons comment les transformer de manière invisible en fonctions de accesseur / mutateur.
99

10-
## Property flags
10+
## Attributs de propriétés
1111

12-
Object properties, besides a **`value`**, have three special attributes (so-called "flags"):
12+
Les propriétés des objets, outre que **`valeur`**, ont trois attributs spéciaux (appelés drapeaux, ou "flags" en anglais):
1313

14-
- **`writable`** -- if `true`, can be changed, otherwise it's read-only.
15-
- **`enumerable`** -- if `true`, then listed in loops, otherwise not listed.
16-
- **`configurable`** -- if `true`, the property can be deleted and these attributes can be modified, otherwise not.
14+
- **`writable`** -- si `true`, peut être modifié, sinon c'est lecture seule.
15+
- **`enumerable`** -- si `true`, alors listé dans les boucles, sinon non listé.
16+
- **`configurable`** -- si `true`, la propriété peut être supprimée et ces attributs peuvent être modifiés, sinon non.
1717

18-
We didn't see them yet, because generally they do not show up. When we create a property "the usual way", all of them are `true`. But we also can change them anytime.
18+
Nous ne les avons pas encore vues, car généralement elles ne se présentent pas. Lorsque nous créons une propriété "de la manière habituelle", ils sont tous `true`. Mais nous pouvons aussi les changer à tout moment.
1919

20-
First, let's see how to get those flags.
20+
Voyons d’abord comment obtenir ces "flags".
2121

22-
The method [Object.getOwnPropertyDescriptor](mdn:js/Object/getOwnPropertyDescriptor) allows to query the *full* information about a property.
22+
La methode [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/getOwnPropertyDescriptor) permet d'interroger les informations *complètes* sur une propriété.
2323

24-
The syntax is:
24+
La syntaxe est la suivante:
2525
```js
2626
let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);
2727
```
2828

2929
`obj`
30-
: The object to get information from.
30+
: L'objet à partir duquel obtenir des informations.
3131

3232
`propertyName`
33-
: The name of the property.
33+
: Le nom de la propriété.
3434

35-
The returned value is a so-called "property descriptor" object: it contains the value and all the flags.
35+
La valeur renvoyée est un objet dit "descripteur de propriété": il contient la valeur et tous les descripteurs.
3636

37-
For instance:
37+
Par exemple:
3838

3939
```js run
4040
let user = {
@@ -54,23 +54,23 @@ alert( JSON.stringify(descriptor, null, 2 ) );
5454
*/
5555
```
5656

57-
To change the flags, we can use [Object.defineProperty](mdn:js/Object/defineProperty).
57+
Pour changer les attributs, on peut utiliser [Object.defineProperty](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/defineProperty).
5858

59-
The syntax is:
59+
La syntaxe est la suivante:
6060

6161
```js
6262
Object.defineProperty(obj, propertyName, descriptor)
6363
```
6464

6565
`obj`, `propertyName`
66-
: The object and its property to apply the descriptor.
66+
: L'objet et sa propriété pour appliquer le descripteur.
6767

6868
`descriptor`
69-
: Property descriptor to apply.
69+
: Descripteur de propriété à appliquer.
7070

71-
If the property exists, `defineProperty` updates its flags. Otherwise, it creates the property with the given value and flags; in that case, if a flag is not supplied, it is assumed `false`.
71+
Si la propriété existe, `defineProperty` met à jour ses attributs. Sinon, il crée la propriété avec la valeur et les descripteurs donnés. Dans ce cas, si aucun drapeau n'est fourni, il est supposé `false`.
7272

73-
For instance, here a property `name` is created with all falsy flags:
73+
Par exemple, ici, une propriété `name` est créée avec tous les attributs falsy:
7474

7575
```js run
7676
let user = {};
@@ -96,13 +96,13 @@ alert( JSON.stringify(descriptor, null, 2 ) );
9696
*/
9797
```
9898

99-
Compare it with "normally created" `user.name` above: now all flags are falsy. If that's not what we want then we'd better set them to `true` in `descriptor`.
99+
Comparez-le avec `user.name` "normalement créé" ci-dessus: maintenant tous les attributs sont falsy. Si ce n'est pas ce que nous voulons, nous ferions mieux de leur attribuer la valeur `true` dans `descriptor`.
100100

101-
Now let's see effects of the flags by example.
101+
Voyons maintenant les effets des attributs par exemple.
102102

103-
## Read-only
103+
## Lecture seule
104104

105-
Let's make `user.name` read-only by changing `writable` flag:
105+
Rendons `user.name` en lecture seule en modifiant le desripteur `writeable`:
106106

107107
```js run
108108
let user = {
@@ -120,21 +120,21 @@ user.name = "Pete"; // Error: Cannot assign to read only property 'name'
120120
*/!*
121121
```
122122

123-
Now no one can change the name of our user, unless they apply their own `defineProperty` to override ours.
123+
Maintenant, personne ne peut changer le nom de notre utilisateur, à moins qu’ils appliquent leur propre `defineProperty` pour remplacer le nôtre.
124124

125-
```smart header="Errors appear only in strict mode"
126-
In the non-strict mode, no errors occur when writing to read-only properties and such. But the operation still won't succeed. Flag-violating actions are just silently ignored in non-strict.
125+
```smart header="Les erreurs apparaissent uniquement en mode strict"
126+
En mode non strict, aucune erreur ne se produit lors de l'écriture dans les propriétés en lecture seule, etc. Mais l'opération ne réussira toujours pas. Les actions qui violent les dexcripteurs sont simplement ignorées en mode non strict.
127127
```
128128

129-
Here's the same example, but the property is created from scratch:
129+
Voici le même exemple, mais la propriété est créée à partir de zéro:
130130

131131
```js run
132132
let user = { };
133133

134134
Object.defineProperty(user, "name", {
135135
*!*
136136
value: "John",
137-
// for new properties need to explicitly list what's true
137+
// besoin de lister explicitement ce qui est true pour les nouvelles propriétés
138138
enumerable: true,
139139
configurable: true
140140
*/!*
@@ -144,11 +144,11 @@ alert(user.name); // John
144144
user.name = "Pete"; // Error
145145
```
146146

147-
## Non-enumerable
147+
## Non énumérable
148148

149-
Now let's add a custom `toString` to `user`.
149+
Ajoutons maintenant un `toString` personnalisé à `user`.
150150

151-
Normally, a built-in `toString` for objects is non-enumerable, it does not show up in `for..in`. But if we add `toString` of our own, then by default it shows up in `for..in`, like this:
151+
Normalement, un `toString` intégré pour les objets n'est pas énumérable, il n'apparaît pas dans `for..in`. Mais si nous ajoutons notre propre `toString`, alors, par défaut, il apparaît dans `for..in`, comme ceci:
152152

153153
```js run
154154
let user = {
@@ -158,11 +158,11 @@ let user = {
158158
}
159159
};
160160

161-
// By default, both our properties are listed:
161+
// Par défaut, nos deux propriétés sont répertoriées:
162162
for (let key in user) alert(key); // name, toString
163163
```
164164

165-
If we don't like it, then we can set `enumerable:false`. Then it won't appear in `for..in` loop, just like the built-in one:
165+
Si nous n'aimons pas cela, alors nous pouvons définir `enumerable: false`. Ensuite, il n'apparaîtra pas dans la boucle `for..in`, comme dans la boucle intégrée:
166166

167167
```js run
168168
let user = {
@@ -179,24 +179,24 @@ Object.defineProperty(user, "toString", {
179179
});
180180

181181
*!*
182-
// Now our toString disappears:
182+
// Maintenant notre toString disparaît:
183183
*/!*
184184
for (let key in user) alert(key); // name
185185
```
186186

187-
Non-enumerable properties are also excluded from `Object.keys`:
187+
Les propriétés non énumérables sont également exclues de `Object.keys`:
188188

189189
```js
190190
alert(Object.keys(user)); // name
191191
```
192192

193-
## Non-configurable
193+
## Non configurable
194194

195-
The non-configurable flag (`configurable:false`) is sometimes preset for built-in objects and properties.
195+
Le descripteur non configurable (`configurable: false`) est parfois prédéfini pour les objets et propriétés intégrés.
196196

197-
A non-configurable property can not be deleted or altered with `defineProperty`.
197+
Une propriété non configurable ne peut pas être supprimée ou modifiée avec `defineProperty`.
198198

199-
For instance, `Math.PI` is read-only, non-enumerable and non-configurable:
199+
Par exemple, `Math.PI` est en lecture seule, non énumérable et non configurable:
200200

201201
```js run
202202
let descriptor = Object.getOwnPropertyDescriptor(Math, 'PI');
@@ -211,17 +211,17 @@ alert( JSON.stringify(descriptor, null, 2 ) );
211211
}
212212
*/
213213
```
214-
So, a programmer is unable to change the value of `Math.PI` or overwrite it.
214+
Ainsi, un programmeur est incapable de changer la valeur de `Math.PI` ou de le remplacer.
215215

216216
```js run
217217
Math.PI = 3; // Error
218218

219-
// delete Math.PI won't work either
219+
// supprimer Math.PI ne fonctionnera pas non plus
220220
```
221221

222-
Making a property non-configurable is a one-way road. We cannot change it back, because `defineProperty` doesn't work on non-configurable properties.
222+
Rendre une propriété non configurable est une route à sens unique. Nous ne pouvons pas le rétablir, car `defineProperty` ne fonctionne pas avec des propriétés non configurables.
223223

224-
Here we are making `user.name` a "forever sealed" constant:
224+
Ici, nous faisons de `user.name` une constante "scellée pour toujours":
225225

226226
```js run
227227
let user = { };
@@ -233,8 +233,8 @@ Object.defineProperty(user, "name", {
233233
});
234234

235235
*!*
236-
// won't be able to change user.name or its flags
237-
// all this won't work:
236+
// ont ne pourra pas changer user.name ou ses descripteurs
237+
// tout cela ne marchera pas:
238238
// user.name = "Pete"
239239
// delete user.name
240240
// defineProperty(user, "name", ...)
@@ -244,9 +244,9 @@ Object.defineProperty(user, "name", {writable: true}); // Error
244244

245245
## Object.defineProperties
246246

247-
There's a method [Object.defineProperties(obj, descriptors)](mdn:js/Object/defineProperties) that allows to define many properties at once.
247+
Il y a une méthode [Object.defineProperties(obj, descriptors)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/defineProperties) qui permet de définir plusieurs propriétés à la fois.
248248

249-
The syntax is:
249+
La syntaxe est la suivante:
250250

251251
```js
252252
Object.defineProperties(obj, {
@@ -256,7 +256,7 @@ Object.defineProperties(obj, {
256256
});
257257
```
258258

259-
For instance:
259+
Par exemple:
260260

261261
```js
262262
Object.defineProperties(user, {
@@ -266,53 +266,53 @@ Object.defineProperties(user, {
266266
});
267267
```
268268

269-
So, we can set many properties at once.
269+
Nous pouvons donc définir plusieurs propriétés à la fois.
270270

271271
## Object.getOwnPropertyDescriptors
272272

273-
To get all property descriptors at once, we can use the method [Object.getOwnPropertyDescriptors(obj)](mdn:js/Object/getOwnPropertyDescriptors).
273+
Pour obtenir tous les descripteurs de propriété à la fois, nous pouvons utiliser la méthode [Object.getOwnPropertyDescriptors(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/getOwnPropertyDescriptors).
274274

275-
Together with `Object.defineProperties` it can be used as a "flags-aware" way of cloning an object:
275+
Avec `Object.defineProperties`, elle peut être utilisé comme moyen de cloner un objet conscient des attributs:
276276

277277
```js
278278
let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
279279
```
280280

281-
Normally when we clone an object, we use an assignment to copy properties, like this:
281+
Normalement, lorsque nous clonons un objet, nous utilisons une affectation pour copier les propriétés, comme ceci:
282282

283283
```js
284284
for (let key in user) {
285285
clone[key] = user[key]
286286
}
287287
```
288288

289-
...But that does not copy flags. So if we want a "better" clone then `Object.defineProperties` is preferred.
289+
...Mais cela ne copie pas les attributs. Donc, si nous voulons un "meilleur" clone, alors `Object.defineProperties` est préféré.
290290

291-
Another difference is that `for..in` ignores symbolic properties, but `Object.getOwnPropertyDescriptors` returns *all* property descriptors including symbolic ones.
291+
Une autre différence est que `for..in` ignore les propriétés symboliques, mais que `Object.getOwnPropertyDescriptors` renvoie *tous* les descripteurs de propriété, y compris les descripteurs symboliques.
292292

293-
## Sealing an object globally
293+
## Sceller un objet globalement
294294

295-
Property descriptors work at the level of individual properties.
295+
Les descripteurs de propriété fonctionnent au niveau des propriétés individuelles.
296296

297-
There are also methods that limit access to the *whole* object:
297+
Il existe également des méthodes qui limitent l'accès à l'objet *entier*:
298298

299-
[Object.preventExtensions(obj)](mdn:js/Object/preventExtensions)
300-
: Forbids the addition of new properties to the object.
299+
[Object.preventExtensions(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/preventExtensions)
300+
: Interdit l'ajout de nouvelles propriétés à l'objet.
301301

302-
[Object.seal(obj)](mdn:js/Object/seal)
303-
: Forbids adding/removing of properties. Sets `configurable: false` for all existing properties.
302+
[Object.seal(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/seal)
303+
: Interdit l'ajout/la suppression de propriétés. Définit `configurable: false` pour toutes les propriétés existantes.
304304

305-
[Object.freeze(obj)](mdn:js/Object/freeze)
306-
: Forbids adding/removing/changing of properties. Sets `configurable: false, writable: false` for all existing properties.
307-
And also there are tests for them:
305+
[Object.freeze(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/freeze)
306+
: Interdit l'ajout/la suppression/la modification de propriétés. Définit `configurable: false, writeable: false` pour toutes les propriétés existantes.
307+
Et aussi il y a des tests pour eux:
308308

309-
[Object.isExtensible(obj)](mdn:js/Object/isExtensible)
310-
: Returns `false` if adding properties is forbidden, otherwise `true`.
309+
[Object.isExtensible(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/isExtensible)
310+
: Retourne `false` si l'ajout de propriétés est interdit, sinon `true`.
311311

312-
[Object.isSealed(obj)](mdn:js/Object/isSealed)
313-
: Returns `true` if adding/removing properties is forbidden, and all existing properties have `configurable: false`.
312+
[Object.isSealed(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/isSealed)
313+
: Renvoie `true` si l'ajout/la suppression de propriétés est interdite et que toutes les propriétés existantes ont `configurable: false`.
314314

315-
[Object.isFrozen(obj)](mdn:js/Object/isFrozen)
316-
: Returns `true` if adding/removing/changing properties is forbidden, and all current properties are `configurable: false, writable: false`.
315+
[Object.isFrozen(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/isFrozen)
316+
: Retourne `true` si l'ajout/la suppression/la modification de propriétés est interdite et si toutes les propriétés actuelles sont `configurable: false, writable: false`.
317317

318-
These methods are rarely used in practice.
318+
Ces méthodes sont rarement utilisées dans la pratique.

1-js/07-object-properties/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# Object properties configuration
1+
# Configuration des propriétés d'objet
22

3-
In this section we return to objects and study their properties even more in-depth.
3+
Dans cette section, nous revenons sur les objets et étudions leurs propriétés encore plus en profondeur.

0 commit comments

Comments
 (0)