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/07-object-properties/01-property-descriptors/article.md
+23-22Lines changed: 23 additions & 22 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,15 +1,15 @@
1
1
2
-
# Sinalizadores e descritores de propriedade
2
+
# Sinalizadores e descritores de propriedades
3
3
4
4
Como sabemos, objetos podem armazenar propriedades.
5
5
6
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.
7
7
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.
8
+
Neste capítulo, nós vamos estudar opções de configurações adicionais, e no próximo nós vamos ver como invisivelmente tornar elas em funções getter/setter.
9
9
10
10
## Sinalizadores de propriedade
11
11
12
-
Propriedades de objeto, além do **`valor`**tem três atributos especiais (também chamados "sinalizadores"):
12
+
Propriedades de objeto, além do **`valor`**têm três atributos especiais (também chamados "sinalizadores"):
13
13
14
14
-**`gravável`** -- se `true`, o valor pode ser alterado, caso contrário, é apenas-leitura.
15
15
-**`enúmeravel`** -- se `true`, então pode ser listado em loops, caso contrário, não pode.
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`.
71
+
Se a proprieade existe, `defineProperty` atualiza o seu sinalizador. Caso contrário, é criada uma propriedade com os sinalizadores e valor dados; neste caso, se um sinalizador não é fornecido, seu valor é assumido como `false`.
72
72
73
-
Por exemplo, aqui a propriedade `name` é criada com todos os sinalizadores falsos:
73
+
Por exemplo, aqui a propriedade `name` é criada com todos os sinalizadores a falso:
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`.
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 configurá-los como `true` no `descriptor`.
100
100
101
101
Agora vamos ver os efeitos dos sinalizadores, por exemplo:
user.name="Pete"; // Error: Cannot assign to read only property 'name'...
119
+
user.name="Pete";
120
+
// Error: Cannot assign to read only property 'name'... (Erro: não é possível a atribuição à variável de apenas leitura 'name'...)
120
121
*/!*
121
122
```
122
123
123
124
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.
124
125
125
126
```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.
127
+
No modo não-estrito, os erros não ocorrem quando escrevendo em propriedades não-graváveis, etc. Mas a operação ainda assim não terá sucesso. Ações que violam os sinalizadores são apenas ignoradas silenciosamentes em modo não-estrito.
127
128
```
128
129
129
130
Aqui está o mesmo exemplo, mas a propriedade é criada do zero.
@@ -134,7 +135,7 @@ let user = { };
134
135
Object.defineProperty(user, "name", {
135
136
*!*
136
137
value:"John",
137
-
// para novas proprieades, precisamos explicitamente listar o que é true
138
+
// para novas proprieades, precisamos explicitamente de listar o que é true
138
139
enumerable:true,
139
140
configurable:true
140
141
*/!*
@@ -148,7 +149,7 @@ user.name = "Alice"; // Erro
148
149
149
150
Agora, vamos adicionar um `toString` customizado ao `user`.
150
151
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:
152
+
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:
152
153
153
154
```js run
154
155
let user = {
@@ -162,7 +163,7 @@ let user = {
162
163
for (let key in user) alert(key); // name, toString
163
164
```
164
165
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:
166
+
Se nós não gostarmos disso, então podemos configurar`enumerable:false`. Então ela não vai aparecer no loop `for..in`, tal como as propriedades embutidas:
166
167
167
168
```js run
168
169
let user = {
@@ -192,7 +193,7 @@ alert(Object.keys(user)); // name
192
193
193
194
## Não-configurável
194
195
195
-
O sinalizador não-configurável (`configurable:false`) algumas vezes é predefinido por objetos e propriedades embutidas.
196
+
O sinalizador não-configurável (`configurable:false`) algumas vezes está predefinido para objetos e propriedades embutidas.
196
197
197
198
Uma propriedade não-configurável não pode ser deletada.
198
199
@@ -221,13 +222,13 @@ Math.PI = 3; // Erro
221
222
222
223
Deixar uma propriedade não-configurável, é um caminho só de ida. Nós não podemos alterar isso novamente com `defineProperty`.
223
224
224
-
Para ser preciso, não-configurabilidade impões várias restrições em`defineProperty`:
225
+
Para ser preciso, a não-configurabilidade impões várias restrições a`defineProperty`:
225
226
1. Não poder mudar o sinalizador `configurable`.
226
-
1. Não poder mudar o sinalizador `enumerable`.
227
+
2. Não poder mudar o sinalizador `enumerable`.
227
228
3. Não poder mudar `writable: false` para `true` (o contrário funciona).
228
229
4. Não poder mudar `get/set` por um acessador de propriedade (mas pode atribuí-los se ausente).
229
230
230
-
**A ideia de "configurable: false" é para prevenir mudanças de sinalizadores de propriedades e sua eliminação, enquanto permite alterar seu valor.**
231
+
**A ideia de "configurable: false" é para prevenir a mudança de sinalizadores de propriedades e a sua eliminação, enquanto permite alterar o seu valor.**
231
232
232
233
Aqui `user.name` é não-configurável, mas nós ainda podemos alterá-lo (pois é gravável):
Então, nós podemos setar várias propriedades de uma vez.
292
+
Então, nós podemos configurar várias propriedades de uma vez.
292
293
293
294
## Object.getOwnPropertyDescriptors
294
295
295
296
Para obter todos os sinalizadores de propriedade de uma vez, nós podemos usar o método [Object.getOwnPropertyDescriptors(obj)](mdn:js/Object/getOwnPropertyDescriptors).
296
297
297
-
Juntamente com `Object.defineProperties` isso pode ser usado como um jeito "consciente-de-sinalizadores" de clonar objetos:
298
+
Juntamente com `Object.defineProperties` isso pode ser usado como um jeito "incluindo-sinalizadores" de clonar objetos:
298
299
299
300
```js
300
301
let clone =Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
@@ -308,7 +309,7 @@ for (let key in user) {
308
309
}
309
310
```
310
311
311
-
...Mas isso não copia os sinalizadores. Então se nós quisermos um clone "melhor" então é preferível `Object.defineProperties`.
312
+
...Mas isso não copia os sinalizadores. Assim, se nós quisermos um clone "melhor" então é preferível `Object.defineProperties`.
312
313
313
314
Outra diferença é que `for..in` ignora propriedades simbólicas, mas `Object.getOwnPropertyDescriptors` returna *todas* as propriedades descritoras, incluindo as simbólicas.
314
315
@@ -322,10 +323,10 @@ Também existem métodos que limitam o acesso ao objeto *inteiro*:
322
323
: Proíbe a adição de novas propriedades ao objeto.
323
324
324
325
[Object.seal(obj)](mdn:js/Object/seal)
325
-
: Proíbe a adição/remoção de propriedades. Seta`configurable: false` para todas as propriedades existentes.
326
+
: Proíbe a adição/remoção de propriedades. Coloca`configurable: false` para todas as propriedades existentes.
326
327
327
328
[Object.freeze(obj)](mdn:js/Object/freeze)
328
-
: Proíbe adicionar/remover/alterar propriedades. Seta`configurable: false, writable: false` para todas as propriedades existentes.
329
+
: Proíbe adicionar/remover/alterar propriedades. Coloca`configurable: false, writable: false` para todas as propriedades existentes.
0 commit comments