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
+24-24Lines changed: 24 additions & 24 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,7 @@ In questo capitolo studieremo ulteriori opzioni di configurazione, e nel prossim
12
12
Le proprietà degli oggetti, oltre ad un **`valore`**, possiedono tre attributi speciali (cosi detti "flags", o "bandiere"):
13
13
14
14
-**`writable`** -- se impostato a `true`, il valore può essere modificato, altrimenti è possibile accedervi in sola lettura.
15
-
-**`enumerable`** -- se impostato a `true`, potrà apparire nei loop, altrimenti non verrà considerata.
15
+
-**`enumerable`** -- se impostato a `true`, appare nei loop, altrimenti non verrà considerata.
16
16
-**`configurable`** -- se impostato a `true`, la proprietà può essere cancellata e questi attributi possono essere modificati.
17
17
18
18
Non li abbiamo mai visti fino ad ora, perché generalmente non vengono mostrati. Quando creiamo una proprietà in "modo ordinario", questi attributi vengono tutti impostati a `true`. Ma possiamo comunque modificarli in qualsiasi momento.
: L'oggetto e la proprietà in cui applicare il descrittore.
66
+
: L'oggetto e la proprietà a cui applicare il descrittore.
67
67
68
68
`descriptor`
69
-
: Descrittore di proprietà dell'oggetto da applicare.
69
+
: Oggetto *descriptor*da utilizzare.
70
70
71
-
Se la proprietà esiste, `defineProperty` aggiornerà l'attributo. Altrimenti, creerà la proprietà con il valore e gli attributi forniti, se un attributo non viene fornito, gli verrà assegnato il valore `false`.
71
+
Se la proprietà esiste, `defineProperty` aggiornerà l'attributo. Altrimenti, creerà la proprietà con il valore e gli attributi forniti; se un attributo non viene fornito, gli verrà assegnato il valore `false`.
72
72
73
-
Ad esempio. qui creiamo una proprietà `name` con tutti gli attributi a`false`:
73
+
Ad esempio, qui creiamo una proprietà `name` con tutti gli attributi `false`:
Confrontandola con la proprietà "creata normalmente" `user.name` vista sopra, ora tutti gli attributi sono a `false`. Se questo non è ciò che vogliamo, allora dovremmo impostarli a `true` tramite il `descriptor`.
99
+
Confrontandola con la proprietà "creata normalmente" `user.name` vista sopra, ora tutti gli attributi sono `false`. Se questo non è ciò che vogliamo, allora dovremmo impostarli a `true` tramite il `descriptor`.
100
100
101
-
Ora analizziamo gli effetti degli attributi guardando ad alcuni esempi.
101
+
Ora analizziamo gli effetti degli attributi guardando alcuni esempi.
102
102
103
103
## Non-writable
104
104
105
-
Vediamo come rendere `user.name` non-writable (non può essere riassegnata), modificando l'attributo `writable`:
105
+
Vediamo come rendere `user.name`*non-writable* (la variabile non può essere riassegnata) modificando l'attributo `writable`:
106
106
107
107
```js run
108
108
let user = {
@@ -123,18 +123,18 @@ user.name = "Pete"; // Error: Cannot assign to read only property 'name'
123
123
Ora nessuno potrà modificare il nome dell'utente, a meno che non vada a sovrascrivere il valore degli attributi con `defineProperty`.
124
124
125
125
```smart header="Gli errori verranno mostrati solamente in strict mode"
126
-
Se non siamo in "strict mode", e tentiamo di sovrascrivere una proprietà non-writable, non verrà mostrato alcun errore. Nonostante non venga mostrato l'errore, l'operazione fallirà comunque. Quindi le violazioni di attributi fuori dalla strict mode verranno ignorate silenziosamente.
126
+
Se non siamo in "strict mode", e tentiamo di sovrascrivere una proprietà non-writable, non verrà mostrato alcun errore. Nonostante non venga mostrato l'errore, l'operazione fallirà comunque. Quindi le violazioni di attributi fuori dalla strict mode verranno silenziosamente ignorate.
127
127
```
128
128
129
-
Qui vediamo lo stesso esempio, ma la proprietà viene creata da zero:
129
+
Qui vediamo lo stesso esempio, ma la proprietà viene creata dal nulla:
130
130
131
131
```js run
132
132
let user = { };
133
133
134
134
Object.defineProperty(user, "name", {
135
135
*!*
136
136
value:"John",
137
-
// per le nuove proprietà dobbiamo esplicitare quali attributi valgono true
137
+
// per le nuove proprietà dobbiamo esplicitare quali attributi sono true
138
138
enumerable:true,
139
139
configurable:true
140
140
*/!*
@@ -148,7 +148,7 @@ user.name = "Pete"; // Error
148
148
149
149
Ora proviamo ad aggiungere un metodo `toString` ad `user`.
150
150
151
-
Normalmente, la funzione built-in (integrata) `toString` per gli oggetti, è non-enumerable, quindi non verrà mostrata nei cicli come `for..in`. Ma se proviamo ad aggiungere una nostra definizione di `toString`, allora questa verrà mostrata nei cicli `for..in`, come nell'esempio:
151
+
Normalmente, la funzione *built-in* (integrata) `toString`, per gli oggetti è non-enumerable, quindi non verrà mostrata nei cicli come `for..in`. Ma se proviamo ad aggiungere una nostra definizione di `toString`, allora questa verrà mostrata nei cicli `for..in`, come nell'esempio:
152
152
153
153
```js run
154
154
let user = {
@@ -162,7 +162,7 @@ let user = {
162
162
for (let key in user) alert(key); // name, toString
163
163
```
164
164
165
-
Se non è cio che ci aspettiamo, possiamo impostare l'attributo `enumerable:false`. In questo modo non verrà più mostrata nei cicli `for..in`, propriò come la funzione integrata definita da JavaScript:
165
+
Se non è ciò che ci aspettiamo, possiamo impostare l'attributo `enumerable:false`. In questo modo non verrà più mostrata nei cicli `for..in`, proprio come la funzione già integrata (definita da Javascript):
166
166
167
167
```js run
168
168
let user = {
@@ -192,11 +192,11 @@ alert(Object.keys(user)); // name
192
192
193
193
## Non-configurable
194
194
195
-
L'attributo non-configurable (`configurable:false`), talvolta è preimpostato negli gli oggetti e nelle proprietà integrate.
195
+
L'attributo non-configurable (`configurable:false`) è talvolta preimpostato negli oggetti e nelle proprietà integrate.
196
196
197
-
Una proprietà non-configurable non può essere cancellata.
197
+
Una proprietà *non-configurable* non può essere cancellata.
198
198
199
-
Ad esempio, `Math.PI` è non-writable, non-enumerable e non-configurable:
199
+
Ad esempio, `Math.PI` è *non-writable*, *non-enumerable* e *non-configurable*:
200
200
201
201
```js run
202
202
let descriptor =Object.getOwnPropertyDescriptor(Math, 'PI');
Quindi, uno sviluppatore, non sarà in grado di cambiare il valore `Math.PI` o sovrascriverlo.
214
+
Quindi, uno sviluppatore non sarà in grado di cambiare il valore `Math.PI` o di sovrascriverlo.
215
215
216
216
```js run
217
217
Math.PI=3; // Error
218
218
219
219
// non si potrebbe comunque cancellare Math.PI
220
220
```
221
221
222
-
Rendere una proprietà non-configurable è una "strada a senso unico". Non possiamo tornare indietro con`defineProperty`.
222
+
Rendere una proprietà *non-configurable* è una "strada a senso unico". Non possiamo tornare indietro tramite`defineProperty`.
223
223
224
224
Per essere precisi, l'attributo non-configurable impone diverse restrizioni su `defineProperty`:
225
225
1. Non possiamo modificare l'attributo `configurable`.
226
226
2. Non possiamo modificare l'attributo `enumerable`.
227
-
3. Non possiamo modificare l'attributo da `writable: false` a `true` (possiamo invece modificarla da `true` a `false`).
227
+
3. Non possiamo modificare l'attributo da `writable: false` a `true` (possiamo invece modificarlo da `true` a `false`).
228
228
4. Non possiamo modificare le funzioni di accesso `get/set` (ma possiamo assegnarle nel caso non siano definite).
229
229
230
230
**L'idea alla base di "configurable: false" è quella di prevenire la modifica e la rimozione degli attributi di una proprietà, permettendo comunque la modifica del suo valore.**
231
231
232
-
In questo esempio `user.name` è non-configurable, ma possiamo comunque modificarlo (poiché è writable):
232
+
In questo esempio `user.name` è *non-configurable*, ma possiamo comunque modificarlo (poiché è *writable*):
233
233
234
234
```js run
235
235
let user = {
@@ -300,7 +300,7 @@ Il metodo `Object.defineProperties` può essere utilizzato per clonare un ogget
300
300
let clone =Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
301
301
```
302
302
303
-
Normalmente quando cloniamo un oggetto, utilizziamo l'assegnazione per copiarne le proprietà, come nell'esempio:
303
+
Normalmente, quando cloniamo un oggetto, utilizziamo l'assegnazione per copiarne le proprietà, come nell'esempio:
304
304
305
305
```js
306
306
for (let key in user) {
@@ -310,7 +310,7 @@ for (let key in user) {
310
310
311
311
...Ma in questo modo non stiamo copiando gli attributi. Quindi per una clonazione più completa, l'utilizzo di `Object.defineProperties` è la strada migliore.
312
312
313
-
Un'altra differenza è che `for..in` ignora le proprietà di tipo symbol, invece`Object.getOwnPropertyDescriptors` ritorna *tutti* i descrittori, inclusi quelli di tipi symbol.
313
+
Un'altra differenza è che `for..in` ignora le proprietà di tipo `symbol`, mentre`Object.getOwnPropertyDescriptors` ritorna *tutti* i descrittori, inclusi quelli di tipo symbol.
314
314
315
315
## Sigillare un oggetto globalmente
316
316
@@ -327,7 +327,7 @@ Esistono però diversi metodi in grado di limitare l'accesso *all'intero* oggett
327
327
[Object.freeze(obj)](mdn:js/Object/freeze)
328
328
: Vieta di aggiungere/rimuovere/modificare le proprietà dell'oggetto. Imposta `configurable: false, writable: false` su tutte le proprietà già esistenti dell'oggetto.
329
329
330
-
Ed esistono anche dei metodi verificare lo stato di un oggetto:
330
+
Ed esistono anche dei metodi per verificare lo stato degli attributi di un oggetto:
: Ritorna `false` se è vietato aggiungere nuove proprietà, altrimenti ritorna `true`.
@@ -338,4 +338,4 @@ Ed esistono anche dei metodi verificare lo stato di un oggetto:
338
338
[Object.isFrozen(obj)](mdn:js/Object/isFrozen)
339
339
: Ritorna `true` se è vietato aggiungere/rimuovere/modificare proprietà, e tutte le altre proprietà sono impostate a `configurable: false, writable: false`.
340
340
341
-
Nella pratica questi metodi sono utilizzati molto raramente.
341
+
In pratica, tuttavia, questi metodi sono utilizzati molto raramente.
0 commit comments