Skip to content

Commit 545af57

Browse files
committed
feat: translate property-descriptors article
1 parent b37a56e commit 545af57

File tree

1 file changed

+82
-83
lines changed
  • 1-js/07-object-properties/01-property-descriptors

1 file changed

+82
-83
lines changed
+82-83
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11

2-
# Property flags and descriptors
2+
# Sinalizadores e descritores de propriedade
33

4-
As we know, objects can store properties.
4+
Como sabemos, objetos podem armazenar propriedades.
55

6-
Until now, a property was a simple "key-value" pair to us. But an object property is actually a more flexible and powerful thing.
6+
Até agora, para nós, uma propriedade era um simples par "chave-valor". Mas uma propriedade de objeto é na verdade uma coisa mais flexível e poderosa.
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+
Neste capítulo, nós vamos estudar opções de configuração adicional, e no próximo nós vamos ver como invisivelmente tornar elas em funções getter/setter.
99

10-
## Property flags
10+
## Sinalizadores de propriedade
1111

12-
Object properties, besides a **`value`**, have three special attributes (so-called "flags"):
12+
Propriedades de objeto, além do **`valor`** tem três atributos especiais (também chamados "sinalizadores"):
1313

14-
- **`writable`** -- if `true`, the value 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+
- **`gravável`** -- se `true`, o valor pode ser alterado, caso contrário, é apenas-leitura.
15+
- **`enúmeravel`** -- se `true`, então pode ser listado em loops, caso contrário, não pode.
16+
- **`configurável`** -- se `true`, a propriedade pode ser deletada e seus atributos modificados, caso contrário não.
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+
Nós não vimos eles ainda, porque geralmente eles não aparecem. Quando criamos uma propriedade "do jeito comum", todos eles são `true`. Mas nós também podemos mudá-los a qualquer hora.
1919

20-
First, let's see how to get those flags.
20+
Primeiro, vamos ver como obter esses sinalizadores.
2121

22-
The method [Object.getOwnPropertyDescriptor](mdn:js/Object/getOwnPropertyDescriptor) allows to query the *full* information about a property.
22+
O método [Object.getOwnPropertyDescriptor](mdn:js/Object/getOwnPropertyDescriptor) nos permite consultar a informação *completa* sobre a propriedade.
2323

24-
The syntax is:
24+
A sintaxe é:
2525
```js
2626
let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);
2727
```
2828

2929
`obj`
30-
: The object to get information from.
30+
: O objeto do qual vamos obter a informação.
3131

3232
`propertyName`
33-
: The name of the property.
33+
: O nome da propriedade.
3434

35-
The returned value is a so-called "property descriptor" object: it contains the value and all the flags.
35+
O valor retornado é também chamado de objeto "descritor de propriedade": ele contém o valor e todos os sinalizadores.
3636

37-
For instance:
37+
Por exemplo:
3838

3939
```js run
4040
let user = {
@@ -44,7 +44,7 @@ let user = {
4444
let descriptor = Object.getOwnPropertyDescriptor(user, 'name');
4545

4646
alert( JSON.stringify(descriptor, null, 2 ) );
47-
/* property descriptor:
47+
/* descritor de propriedade:
4848
{
4949
"value": "John",
5050
"writable": true,
@@ -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+
Para mudar os sinalizadores, nós podemos usar o [Object.defineProperty](mdn:js/Object/defineProperty).
5858

59-
The syntax is:
59+
A sintaxe é:
6060

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

6565
`obj`, `propertyName`
66-
: The object and property to work on.
66+
: O objeto e a propriedade nos quais atuar.
6767

6868
`descriptor`
69-
: Property descriptor object to apply.
69+
: Descritor de propriedade de objeto a aplicar.
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+
Se a proprieade existe, `defineProperty` atualiza seu sinalizador. Caso contrário, é criada uma propriedade com os sinalizadores setados; neste caso, se um sinalizador não é enviado, seu valor é assumido como `false`.
7272

73-
For instance, here a property `name` is created with all falsy flags:
73+
Por exemplo, aqui a propriedade `name` é criada com todos os sinalizadores falsos:
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+
Compare isso com o `user.name` "criado normalmente" acima: agora todos os sinalizadores são falsos. Se não é isso que queremos, então é melhor setá-los como `true` no `descriptor`.
100100

101-
Now let's see effects of the flags by example.
101+
Agora vamos ver os efeitos dos sinalizadores, por exemplo:
102102

103-
## Non-writable
103+
## Não-gravável
104104

105-
Let's make `user.name` non-writable (can't be reassigned) by changing `writable` flag:
105+
Vamos deixar `user.name` não-gravável (não pode ser reatribuído) alterando o sinalizador `writable`:
106106

107107
```js run
108108
let user = {
@@ -120,36 +120,35 @@ 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+
Agora, ninguém pode alterar o nome do nosso usuário, a não ser que eles apliquem seus próprios `defineProperty` para sobrescrever o nosso.
124124

125-
```smart header="Errors appear only in strict mode"
126-
In the non-strict mode, no errors occur when writing to non-writable properties and such. But the operation still won't succeed. Flag-violating actions are just silently ignored in non-strict.
125+
```smart header="Erros aparecem apenas em strict mode"
126+
No modo não-estrito, os erros não ocorrem quando gravando em propriedades não-graváveis, etc. Mas a operação ainda não terá sucesso. Ações que violam os sinalizadores são apenas ignoradas silenciosamentes em modo não-estrito.
127127
```
128128

129-
Here's the same example, but the property is created from scratch:
129+
Aqui está o mesmo exemplo, mas a propriedade é criada do zero.
130130

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

134134
Object.defineProperty(user, "name", {
135135
*!*
136136
value: "John",
137-
// for new properties we need to explicitly list what's true
137+
// para novas proprieades, precisamos explicitamente listar o que é true
138138
enumerable: true,
139139
configurable: true
140140
*/!*
141141
});
142142

143-
alert(user.name); // Pete
144-
user.name = "Alice"; // Error
143+
alert(user.name); // John
144+
user.name = "Alice"; // Erro
145145
```
146146

147+
## Não-enumerável
147148

148-
## Non-enumerable
149+
Agora, vamos adicionar um `toString` customizado ao `user`.
149150

150-
Now let's add a custom `toString` to `user`.
151-
152-
Normally, a built-in `toString` for objects is non-enumerable, it does not show up in `for..in`. But if we add a `toString` of our own, then by default it shows up in `for..in`, like this:
151+
Normalmente, um `toString` embutido em objetos é não-enumerável, e não aparece em `for...in`. Mas se nós adicionarmos um `toString` por nós mesmos, então por padrão ele aparece em `for...in`, desta forma:
153152

154153
```js run
155154
let user = {
@@ -159,11 +158,11 @@ let user = {
159158
}
160159
};
161160

162-
// By default, both our properties are listed:
161+
// Por padrão, ambas as nossas propriedades são listadas:
163162
for (let key in user) alert(key); // name, toString
164163
```
165164

166-
If we don't like it, then we can set `enumerable:false`. Then it won't appear in a `for..in` loop, just like the built-in one:
165+
Se nós não gostarmos disso, então podemos setar `enumerable:false`. Então ela não vai aparecer no loop `for...in`, assim como as propriedades embutidas:
167166

168167
```js run
169168
let user = {
@@ -180,24 +179,24 @@ Object.defineProperty(user, "toString", {
180179
});
181180

182181
*!*
183-
// Now our toString disappears:
182+
// Agora nosso toString desaparece:
184183
*/!*
185184
for (let key in user) alert(key); // name
186185
```
187186

188-
Non-enumerable properties are also excluded from `Object.keys`:
187+
Propriedades não-enumeráveis também são excluídas de `Object.keys`:
189188

190189
```js
191190
alert(Object.keys(user)); // name
192191
```
193192

194-
## Non-configurable
193+
## Não-configurável
195194

196-
The non-configurable flag (`configurable:false`) is sometimes preset for built-in objects and properties.
195+
O sinalizador não-configurável (`configurable:false`) algumas vezes é predefinido por objetos e propriedades embutidas.
197196

198-
A non-configurable property can not be deleted.
197+
Uma propriedade não-configurável não pode ser deletada.
199198

200-
For instance, `Math.PI` is non-writable, non-enumerable and non-configurable:
199+
Por exemplo, `Math.PI` é não-gravável, não-enumerável e não-configurável:
201200

202201
```js run
203202
let descriptor = Object.getOwnPropertyDescriptor(Math, 'PI');
@@ -212,25 +211,25 @@ alert( JSON.stringify(descriptor, null, 2 ) );
212211
}
213212
*/
214213
```
215-
So, a programmer is unable to change the value of `Math.PI` or overwrite it.
214+
Então, um programador é impossibilitado de mudar o valor de `Math.PI` ou sobrescrevê-lo.
216215

217216
```js run
218-
Math.PI = 3; // Error
217+
Math.PI = 3; // Erro
219218

220-
// delete Math.PI won't work either
219+
// deletar Math.PI também não irá funcionar
221220
```
222221

223-
Making a property non-configurable is a one-way road. We cannot change it back with `defineProperty`.
222+
Deixar uma propriedade não-configurável, é um caminho só de ida. Nós não podemos alterar isso novamente com `defineProperty`.
224223

225-
To be precise, non-configurability imposes several restrictions on `defineProperty`:
226-
1. Can't change `configurable` flag.
227-
2. Can't change `enumerable` flag.
228-
3. Can't change `writable: false` to `true` (the other way round works).
229-
4. Can't change `get/set` for an accessor property (but can assign them if absent).
224+
Para ser preciso, não-configurabilidade impões várias restrições em `defineProperty`:
225+
1. Não poder mudar o sinalizador `configurable`.
226+
1. Não poder mudar o sinalizador `enumerable`.
227+
3. Não poder mudar `writable: false` para `true` (o contrário funciona).
228+
4. Não poder mudar `get/set` por um acessador de propriedade (mas pode atribuí-los se ausente).
230229

231-
**The idea of "configurable: false" is to prevent changes of property flags and its deletion, while allowing to change its value.**
230+
**A ideia de "configurable: false" é para prevenir mudanças de sinalizadores de propriedades e sua eliminação, enquanto permite alterar seu valor.**
232231

233-
Here `user.name` is non-configurable, but we can still change it (as it's writable):
232+
Aqui `user.name` é não-configurável, mas nós ainda podemos alterá-lo (pois é gravável):
234233

235234
```js run
236235
let user = {
@@ -241,11 +240,11 @@ Object.defineProperty(user, "name", {
241240
configurable: false
242241
});
243242

244-
user.name = "Pete"; // works fine
245-
delete user.name; // Error
243+
user.name = "Pete"; // funciona corretamente
244+
delete user.name; // Erro
246245
```
247246

248-
And here we make `user.name` a "forever sealed" constant:
247+
E aqui nós deixamos `user.name` uma constante "selada para sempre":
249248

250249
```js run
251250
let user = {
@@ -257,8 +256,8 @@ Object.defineProperty(user, "name", {
257256
configurable: false
258257
});
259258

260-
// won't be able to change user.name or its flags
261-
// all this won't work:
259+
// não será possível alterar user.name ou seus sinalizadores
260+
// nada disso irá funcionar
262261
user.name = "Pete";
263262
delete user.name;
264263
Object.defineProperty(user, "name", { value: "Pete" });
@@ -267,9 +266,9 @@ Object.defineProperty(user, "name", { value: "Pete" });
267266

268267
## Object.defineProperties
269268

270-
There's a method [Object.defineProperties(obj, descriptors)](mdn:js/Object/defineProperties) that allows to define many properties at once.
269+
Existe um método [Object.defineProperties(obj, descriptors)](mdn:js/Object/defineProperties) que permite definir várias propriedades de uma vez.
271270

272-
The syntax is:
271+
A sintaxe é:
273272

274273
```js
275274
Object.defineProperties(obj, {
@@ -279,7 +278,7 @@ Object.defineProperties(obj, {
279278
});
280279
```
281280

282-
For instance:
281+
Por exemplo:
283282

284283
```js
285284
Object.defineProperties(user, {
@@ -289,54 +288,54 @@ Object.defineProperties(user, {
289288
});
290289
```
291290

292-
So, we can set many properties at once.
291+
Então, nós podemos setar várias propriedades de uma vez.
293292

294293
## Object.getOwnPropertyDescriptors
295294

296-
To get all property descriptors at once, we can use the method [Object.getOwnPropertyDescriptors(obj)](mdn:js/Object/getOwnPropertyDescriptors).
295+
Para obter todos os sinalizadores de propriedade de uma vez, nós podemos usar o método [Object.getOwnPropertyDescriptors(obj)](mdn:js/Object/getOwnPropertyDescriptors).
297296

298-
Together with `Object.defineProperties` it can be used as a "flags-aware" way of cloning an object:
297+
Juntamente com `Object.defineProperties` isso pode ser usado como um jeito "consciente-de-sinalizadores" de clonar objetos:
299298

300299
```js
301300
let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
302301
```
303302

304-
Normally when we clone an object, we use an assignment to copy properties, like this:
303+
Normalmente quando nós clonamos um objeto, nós usamos uma atribuição para copiar propriedades, desta forma:
305304

306305
```js
307306
for (let key in user) {
308307
clone[key] = user[key]
309308
}
310309
```
311310

312-
...But that does not copy flags. So if we want a "better" clone then `Object.defineProperties` is preferred.
311+
...Mas isso não copia os sinalizadores. Então se nós quisermos um clone "melhor" então é preferível `Object.defineProperties`.
313312

314-
Another difference is that `for..in` ignores symbolic properties, but `Object.getOwnPropertyDescriptors` returns *all* property descriptors including symbolic ones.
313+
Outra diferença é que `for..in` ignora propriedades simbólicas, mas `Object.getOwnPropertyDescriptors` returna *todas* as propriedades descritoras, incluindo as simbólicas.
315314

316-
## Sealing an object globally
315+
## Selando um objeto globalmente
317316

318-
Property descriptors work at the level of individual properties.
317+
Descritores de propriedade atuam no mesmo nível de propriedades individuais.
319318

320-
There are also methods that limit access to the *whole* object:
319+
Também existem métodos que limitam o acesso ao objeto *inteiro*:
321320

322321
[Object.preventExtensions(obj)](mdn:js/Object/preventExtensions)
323-
: Forbids the addition of new properties to the object.
322+
: Proíbe a adição de novas propriedades ao objeto.
324323

325324
[Object.seal(obj)](mdn:js/Object/seal)
326-
: Forbids adding/removing of properties. Sets `configurable: false` for all existing properties.
325+
: Proíbe a adição/remoção de propriedades. Seta `configurable: false` para todas as propriedades existentes.
327326

328327
[Object.freeze(obj)](mdn:js/Object/freeze)
329-
: Forbids adding/removing/changing of properties. Sets `configurable: false, writable: false` for all existing properties.
328+
: Proíbe adicionar/remover/alterar propriedades. Seta `configurable: false, writable: false` para todas as propriedades existentes.
330329

331-
And also there are tests for them:
330+
E também existem testes para eles:
332331

333332
[Object.isExtensible(obj)](mdn:js/Object/isExtensible)
334-
: Returns `false` if adding properties is forbidden, otherwise `true`.
333+
: Retorna `false` se a adição de propriedades é proibida, caso contrátio `true`.
335334

336335
[Object.isSealed(obj)](mdn:js/Object/isSealed)
337-
: Returns `true` if adding/removing properties is forbidden, and all existing properties have `configurable: false`.
336+
: Retorna `true` se adição/remoção de propriedades são proibidas, e todas as propriedades existentes são `configurable: false`.
338337

339338
[Object.isFrozen(obj)](mdn:js/Object/isFrozen)
340-
: Returns `true` if adding/removing/changing properties is forbidden, and all current properties are `configurable: false, writable: false`.
339+
: Retorna `true` se adição/remoção/alteração de propriedades são proibidas, e todas as propriedades atuais são `configurable: false, writable: false`.
341340

342-
These methods are rarely used in practice.
341+
Estes métodos são raramentes usados na prática.

0 commit comments

Comments
 (0)