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/99-js-misc/01-proxy/article.md
+17-17Lines changed: 17 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -81,7 +81,7 @@ Esistono anche altre invarianti, come:
81
81
82
82
Le "trappole" possono intercettare queste operazioni, ma devono seguire le regole viste.
83
83
84
-
Le invarianti assicurano che le funzionalità del linguaggio si comportino in maniera corretta e consistente. La lista completa delle invarianti è disponibile [nelle specifiche](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots). Probabilmente non le violerai, a meno ché tu non stia facendo qualcosa di strano.
84
+
Le invarianti assicurano che le funzionalità del linguaggio si comportino in maniera corretta e consistente. La lista completa delle invarianti è disponibile [nelle specifiche](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots). Probabilmente non le violerai, a meno che tu non stia facendo qualcosa di strano.
Attualmente, se non esiste un termine, la lettura dal `dictionary` ritorna `undefined`. Ma nella pratica, ritornare un termine non tradotto è generalmente meglio di `undefined`. Quindi facciamo in modo che ritorni il termine non tradotto piuttosto di `undefined`.
142
+
In questo modo, se non esiste un termine, la lettura dal `dictionary` ritorna `undefined`, ma nella pratica, ritornare un termine non tradotto è generalmente meglio. Quindi facciamo in modo che ritorni il termine non tradotto piuttosto di `undefined`.
143
143
144
144
Per farlo, costruiremo un contenitore per `dictionary` con un proxy che intrecetterà le operazioni di lettura:
145
145
@@ -162,7 +162,7 @@ dictionary = new Proxy(dictionary, {
162
162
}
163
163
});
164
164
165
-
// Cerchiamo un termine casuale nel dictionary!
165
+
// Cerchiamo un termine nel dictionary!
166
166
// Nel peggiore dei casi, questo non sarà tradotto.
167
167
alert( dictionary['Hello'] ); // Hola
168
168
*!*
@@ -177,12 +177,12 @@ Da notare come il proxy sovrascrive la variabile:
177
177
dictionary = new Proxy(dictionary, ...);
178
178
```
179
179
180
-
Il proxy dovrebbe rimpiazzare completamente il target, ovunque. Nessuno dovrebbe più fare riferimento all'oggetto target una volta che questo è stato racchiuso da un proxy. Altrimenti diventerebbe molto facile commettere errori.
180
+
Il proxy dovrebbe rimpiazzare completamente l'oggetto target, ovunque. Nessuno dovrebbe più fare riferimento all'oggetto target una volta che questo è stato racchiuso da un proxy. Altrimenti diventerebbe molto facile commettere errori.
181
181
````
182
182
183
183
## Validazione con la trappola "set"
184
184
185
-
Ipotizziamo di volere un array di soli numeri. Se viene aggiunto un valore di un altro tipo, questo dovrebbe generare un errore.
185
+
Ipotizziamo di volere un array di soli numeri. Se viene aggiunto un valore di un altro tipo, dovrebbe venire generato un errore.
186
186
187
187
La "trappola" `set` si innesca quando si accede in scrittura ad una proprietà.
188
188
@@ -224,7 +224,7 @@ numbers.push("test"); // TypeError ('set' di proxy ha ritornato false)
224
224
alert("This line is never reached (error in the line above)");
225
225
```
226
226
227
-
Da notare: la funzionalità interna degli array integrati continuano a funzionare! I valori vengono aggiunti tramite `push`. La proprietà `length` viene auto-incrementata quando i valori vengono aggiunti. Il nostro proxy non rompe nulla.
227
+
Da notare: le funzionalità interna degli array integrati continuano a funzionare! I valori vengono aggiunti tramite `push`. La proprietà `length` viene auto-incrementata quando i valori vengono aggiunti. Il nostro proxy non rompe nulla.
228
228
229
229
Non dobbiamo sovrascrivere i metodi di aggiunta valori agli array come `push`, `unshift` e così via per aggiungere i controlli, poiché questi metodi internamente utilizzano operazioni di `[[Set]]` che verranno intercettate dal proxy.
230
230
@@ -245,12 +245,12 @@ I cicli `Object.keys`, `for..in` e molti altri metodi che iterano sulle propriet
245
245
Questi metodi si distinguono per alcuni dettagli:
246
246
- `Object.getOwnPropertyNames(obj)` ritorna le chiavi non-symbol.
247
247
- `Object.getOwnPropertySymbols(obj)` ritorna le chiavi symbol.
248
-
- `Object.keys/values()` ritorna coppie keys/values non-symbol, con il flag `enumerable` (i flag sono state spiegate nell'articolo <info:property-descriptors>).
249
-
- `for..in` cicla su chiavi non-symbol, con il flag `enumerable`, ed anche sulle chiavi del prototype.
248
+
- `Object.keys/values()` ritorna coppie keys/values non-symbol, con il flag `enumerable` (i flag sono stati spiegati nell'articolo <info:property-descriptors>).
249
+
- `for..in` itera su chiavi non-symbol, con il flag `enumerable`, ed anche sulle chiavi del prototype.
250
250
251
251
...Ma tutti questi incominciamo dalla stessa lista.
252
252
253
-
Nell'esempio sotto, utilizziamo la trappola `ownKeys` per far sì che `for..in` cicli su `user`, `Object.keys` e `Object.values`, saltando le proprietà il cui nome incomincia con un underscore `_`:
253
+
Nell'esempio sotto, utilizziamo la trappola `ownKeys` per far sì che `for..in` esegua il ciclo su `user`, `Object.keys` e `Object.values`, saltando le proprietà il cui nome incomincia con un underscore `_`:
254
254
255
255
```js run
256
256
let user = {
@@ -270,7 +270,7 @@ user = new Proxy(user, {
270
270
// "ownKeys" filtra _password, saltandolo
271
271
for(let key in user) alert(key); // name, then: age
272
272
273
-
// abbiamo lo stesso effetto in questi meotodi:
273
+
// abbiamo lo stesso effetto in questi metodi:
274
274
alert( Object.keys(user) ); // name,age
275
275
alert( Object.values(user) ); // John,30
276
276
```
@@ -293,7 +293,7 @@ user = new Proxy(user, {
293
293
alert( Object.keys(user) ); // <empty>
294
294
```
295
295
296
-
Perché? La motivazione è semplice: `Object.keys` ritorna solamente le proprietà con il flag `enumerable`. Per verificarlo, invoca il metodo interno `[[GetOwnProperty]]`su ogni proprietà per ottenere [i suoi descrittori](info:property-descriptors). E in questo caso, poiché non ci sono proprietà, i descrittori sono vuoti, non abbiamo alcun flag `enumerable`, quindi questa verrà saltata.
296
+
Perché? La motivazione è semplice: `Object.keys` ritorna solamente le proprietà con il flag `enumerable`. Per verificarlo, invoca il metodo interno `[[GetOwnProperty]]`su ogni proprietà per ottenere [i suoi descrittori](info:property-descriptors). In questo caso, poiché non ci sono proprietà, i descrittori sono vuoti, non abbiamo alcun flag `enumerable`, quindi questa verrà saltata.
297
297
298
298
Per far sì che `Object.keys` ritorni una proprietà, è necessario che questa esista nell'oggetto con il flag `enumerable`, oppure possiamo intercettare l'invocazione di `[[GetOwnProperty]]` (tramite la trappola `getOwnPropertyDescriptor`), e ritornare un descrittore con `enumerable: true`.
299
299
@@ -324,7 +324,7 @@ Ripetiamolo una volta ancora: è sufficiente intercettare `[[GetOwnProperty]]` s
324
324
325
325
## Proprietà protette da "deleteProperty" e altre trappole
326
326
327
-
Esiste una convenzione piuttosto diffusa, in cui le proprietà e i metodi il cui nome ha come suffisso un underscore `_`, sono da considerarsi interne. Non dovrebbero quindi essere accedute dall'esterno dell'oggetto.
327
+
Esiste una convenzione piuttosto diffusa, in cui le proprietà e i metodi il cui nome ha come suffisso un underscore `_`, sono da considerarsi interne. Non bisognerebbe quindi accedervi dall'esterno dell'oggetto.
328
328
329
329
Anche se rimane tecnicamente possibile accedervi:
330
330
@@ -337,7 +337,7 @@ let user = {
337
337
alert(user._password); // secret
338
338
```
339
339
340
-
Possiamo utilizzare un proxy per rendere inaccessibile le proprietà che iniziano con `_`.
340
+
Possiamo utilizzare un proxy per rendere inaccessibili le proprietà che iniziano con `_`.
341
341
342
342
Avremo bisogno delle seguenti trappole:
343
343
-`get` per ritornare un errore nel tentativo di accedere a questa proprietà,
@@ -474,7 +474,7 @@ La trappola `has` intercetta le invocazioni di `in`.
474
474
-`target` -- è l'oggetto target, passato come primo argomento in `new Proxy`,
475
475
-`property` -- nome della proprietà
476
476
477
-
Qui vediamo la demo:
477
+
Qui vediamo una dimostrazione:
478
478
479
479
```js run
480
480
let range = {
@@ -725,7 +725,7 @@ Ma se rimuoviamo il proxy, tutto funziona correttamente.
725
725
726
726
Il problema sta quindi nel proxy, alla riga `(*)`.
727
727
728
-
1. Quando leggiamo `admin.name`, poiché l'oggetto `admin` non possiede questa proprietà, la ricerca prosegue nel suo prototype.
728
+
1. Quando leggiamo `admin.name`, poiché l'oggetto `admin` non possiede questa proprietà, la ricerca prosegue nel suo prototype.
729
729
2. Il prototype è `userProxy`.
730
730
3. Durante la lettura della proprietà `name` dal proxy, la trappola `get` viene innescata e ritorna la proprietà dell'oggetto originale `target[prop]` alla riga `(*)`.
731
731
@@ -924,7 +924,7 @@ I proxy possono intercettare molti operatori, come `new` (con `construct`), `in`
924
924
925
925
Ma non esiste alcun modo per poter intercettare un test di uguaglianza stretta tra oggetti. Un oggetto è strettamente uguale solamente a se stesso, e a nient'altro.
926
926
927
-
Quindi tutte le operazioni ed le classi integrate che verificano l'uguaglianza tra oggetti differenzieranno l'oggetto dal suo proxy. Non c'è alcun sistema di sostituzione "trasparente" in questo caso.
927
+
Quindi tutte le operazioni e le classi integrate che verificano l'uguaglianza tra oggetti differenzieranno l'oggetto dal suo proxy. Non c'è alcun sistema di sostituzione "trasparente" in questo caso.
928
928
```
929
929
930
930
## Proxy revocabili
@@ -1029,5 +1029,5 @@ I proxy hanno però delle limitazioni:
1029
1029
1030
1030
- Gli oggetti integrati possiedono degli "slot interni", ma l'accesso a questi non può essere intercettato dai proxy. Guardate il workaround descritto sopra.
1031
1031
- Lo stesso vale per i campi privati delle classi; questi vengono implementati internamente utilizzando gli slot. Quindi le invocazioni dei metodi tramite proxy devono possedere il target object assegnato a `this` per potervi accedere.
1032
-
- I test di uguaglianza `===` non possono essere intercettati.
1032
+
- I test di uguaglianza `===`sugli oggetti, non possono essere intercettati.
1033
1033
- Performance: i benchmark dipendono molto dal motore JavaScript, ma generalmente l'accesso alle proprietà utilizzando un proxy, richiede più tempo. Anche se, nella pratica, questo ha importanza solo per oggetti che creano "colli di bottiglia".
0 commit comments