Skip to content

Commit 4afa991

Browse files
committed
fix typos
1 parent 3702eea commit 4afa991

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

1-js/99-js-misc/01-proxy/article.md

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Proxy e Reflect
22

3-
Un oggetto `Proxy` racchiude un altro oggetto e ne intercetta le operazioni, come quelle di lettura/scrittura e molte altre, può eventualmente gestirle a modo suo, oppure, in maniera del tutto trasparente, lasciare che sia l'oggetto ad occuoparsene.
3+
Un oggetto `Proxy` racchiude un altro oggetto e ne intercetta le operazioni, come quelle di lettura/scrittura e molte altre, può eventualmente gestirle a modo suo, oppure, in maniera del tutto trasparente, lasciare che sia l'oggetto ad occuparsene.
44

55
I proxy vengono utilizzati da molte librerie ed alcuni framework per browsers. Ne vedremo molte applicazioni pratiche in questo articolo.
66

@@ -13,9 +13,9 @@ let proxy = new Proxy(target, handler)
1313
```
1414

1515
- `target` -- è l'oggetto da racchiudere, può essere qualsiasi cosa, anche funzioni.
16-
- `handler` -- configurazione del proxy: un oggetto con "trappole", metodi che intercettano operazioni. Ad esempio una "trappola" `get` per la lettura di una proprietà di `target`, `set` per la scrittura di una prorietà di `target`, e così via.
16+
- `handler` -- configurazione del proxy: un oggetto con "trappole", metodi che intercettano operazioni. Ad esempio una "trappola" `get` per la lettura di una proprietà di `target`, `set` per la scrittura di una proprietà di `target`, e così via.
1717

18-
Per le operazioni sul `proxy`, se c'è un "tappola" corrispondente in `handler`, allora questa verrà eseguita, e il proxy potrà gestirla, altrimenti l'operazione verrà eseguita su `target`.
18+
Per le operazioni sul `proxy`, se c'è un "trappola" corrispondente in `handler`, allora questa verrà eseguita, e il proxy potrà gestirla, altrimenti l'operazione verrà eseguita su `target`.
1919
Come primo esempio, creiamo un proxy senza "trappole":
2020

2121
```js run
@@ -46,11 +46,11 @@ Per attivare più funzionalità, aggiungiamo qualche "trappola".
4646

4747
Cosa possiamo intercettare?
4848

49-
Per molte operazioni sugli oggetti, esiste un cosidetto "metodo interno" nella specifiche JavaScript che ne descrive il funzionamento a basso livello. Ad esempio `[[Get]]`, il metodo interno per la lettura delle proprietà, e `[[Set]]`, il metodo interno per la scrittura delle proprietà, e così via. Questi metodi vengono utilizzati solamente nelle specifiche, non possiamo invocarli direttamente utilizzandone il nome.
49+
Per molte operazioni sugli oggetti, esiste un così detto "metodo interno" nella specifiche JavaScript che ne descrive il funzionamento a basso livello. Ad esempio `[[Get]]`, il metodo interno per la lettura delle proprietà, e `[[Set]]`, il metodo interno per la scrittura delle proprietà, e così via. Questi metodi vengono utilizzati solamente nelle specifiche, non possiamo invocarli direttamente utilizzandone il nome.
5050

51-
Le trappole "proxy" intercettano le invocazioni di questi metodi. Queste vengono elencate nelle[specifiche Proxy](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots) e nella tabella sottostante.
51+
Le trappole "proxy" intercettano le invocazioni di questi metodi. Queste vengono elencate nelle [specifiche Proxy](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots) e nella tabella sottostante.
5252

53-
Per ogni metodo interno, esiste una "trappola" in questa tabella: il nome del metodo che possiamo aggiungere al parametro `handler` del `new Proxy` per interecettare l'operazione:
53+
Per ogni metodo interno, esiste una "trappola" in questa tabella: il nome del metodo che possiamo aggiungere al parametro `handler` del `new Proxy` per intercettare l'operazione:
5454

5555
| Metodo Interno | Handler | Innescato quando... |
5656
|-----------------|----------------|-------------|
@@ -81,7 +81,7 @@ Esistono anche altre invarianti, come:
8181
8282
Le "trappole" possono intercettare queste operazioni, ma devono seguire le regole viste.
8383
84-
Le invaraianti assicurano che le funzionalità di 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à di 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.
8585
```
8686

8787
Vediamo come funzionano con esempi pratici.
@@ -102,7 +102,7 @@ Utilizziamo `get` per implementare i valore di default di un oggetto.
102102

103103
Costruiremo un array numerico che ritornerà `0` per valori inesistenti.
104104

105-
Soltiamente, quando si prova ad accedere ad una elemento non esistente di un array, si ottiene `undefined`, ma noi costruiremo un proxy di un array che ritorna `0` nel caso in cui la prorpietà non esistesse:
105+
Solitamente, quando si prova ad accedere ad una elemento non esistente di un array, si ottiene `undefined`, ma noi costruiremo un proxy di un array che ritorna `0` nel caso in cui la proprietà non esistesse:
106106

107107
```js run
108108
let numbers = [0, 1, 2];
@@ -193,7 +193,7 @@ La "trappola" `set` si innesca quando si accede in scrittura ad una proprietà.
193193
- `value` -- il valore della proprietà,
194194
- `receiver` -- similmente alla trappola `get`, ha importanza solamente per le proprietà di tipo setter.
195195

196-
La trappola `set` dovrebbe ritornare `true` se è stata imposta correttamete, `false` altrimenti (innescando `TypeError`).
196+
La trappola `set` dovrebbe ritornare `true` se è stata imposta correttamente, `false` altrimenti (innescando `TypeError`).
197197

198198
Utilizziamola per validare un nuovo valore:
199199

@@ -293,7 +293,7 @@ user = new Proxy(user, {
293293
alert( Object.keys(user) ); // <empty>
294294
```
295295

296-
Perché? La motivazione è semplice: `Object.keys` ritorna solamente le prorpietà con la 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 alcuna flag `enumerable`, quindi questa verrà saltata.
296+
Perché? La motivazione è semplice: `Object.keys` ritorna solamente le proprietà con la 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 alcuna flag `enumerable`, quindi questa verrà saltata.
297297

298298
Per far sì che `Object.keys` ritorni una proprietà, è necessario che, o questa esiste nell'oggetto con la flag `enumerable`, oppure possiamo intercettare l'invocazione di `[[GetOwnProperty]]` (tramite la trappola `getOwnPropertyDescriptor`), e ritornare un descrittore con `enumerable: true`.
299299

@@ -440,9 +440,9 @@ Un'invocazione di `user.checkPassword()` passerà al proxy `user` come `this` (l
440440

441441
Quindi leghiamo il contesto dei metodi dell'oggetto all'oggetto originale, `target`, alla riga `(*)`. Le future invocazioni utilizzeranno `target` come `this`, senza alcuna trappola.
442442

443-
Questa soluzione solitamenete funziona, ma non è ideale, poiché un metodo potrebbe passare l'oggetto senza proxy ovunque, e a quel punto faremmo un errore: dov'è l'oggetto originale, e dov'è quello con il proxy?
443+
Questa soluzione solitamente funziona, ma non è ideale, poiché un metodo potrebbe passare l'oggetto senza proxy ovunque, e a quel punto faremmo un errore: dov'è l'oggetto originale, e dov'è quello con il proxy?
444444

445-
Oltretutto, un oggetto potrebbe essere racchiuso in più proxy (più proxy potrebbero aggiungere diverse funzionalità all'oggetto), e nel caso in cui passassimo un oggettto senza proxy ad un metodo, potremmo ottenere conseguenze inaspettate.
445+
Oltretutto, un oggetto potrebbe essere racchiuso in più proxy (più proxy potrebbero aggiungere diverse funzionalità all'oggetto), e nel caso in cui passassimo un oggetto senza proxy ad un metodo, potremmo ottenere conseguenze inaspettate.
446446

447447
Quindi, un proxy del genere non dovrebbe essere utilizzato ovunque.
448448

@@ -465,13 +465,13 @@ let range = {
465465
};
466466
```
467467

468-
Vorremmo usare l'operatore `in` per verificare che un numero appartenga al`range`.
468+
Vorremmo usare l'operatore `in` per verificare che un numero appartenga al `range`.
469469

470470
La trappola `has` intercetta le invocazioni di `in`.
471471

472472
`has(target, property)`
473473

474-
- `target` -- è l'oggetto target, passanto come primo argomento in `new Proxy`,
474+
- `target` -- è l'oggetto target, passato come primo argomento in `new Proxy`,
475475
- `property` -- nome della proprietà
476476

477477
Qui vediamo la demo:
@@ -502,7 +502,7 @@ Semplice zucchero sintattico, vero? Molto semplice da implementare.
502502

503503
Possiamo costruire un proxy anche per funzioni.
504504

505-
La trappola `apply(target, thisArg, args)` gestisce l'invocazinone di un proxy come funzione:
505+
La trappola `apply(target, thisArg, args)` gestisce l'invocazione di un proxy come funzione:
506506

507507
- `target` è l'oggetto target (le funzioni sono oggetti in JavaScript),
508508
- `thisArg` è il valore di `this`.
@@ -512,7 +512,7 @@ Ad esempio, il decorator `delay(f, ms)`, che abbiamo sviluppato nell'articolo <i
512512

513513
In quell'articolo lo abbiamo fatto senza proxy. Un'invocazione di `delay(f, ms)` ritornava una funzione che inoltra le chiamate di `f` dopo `ms` millisecondi.
514514

515-
Qui vediamo la precendente implementazione, basata sulla funzione:
515+
Qui vediamo la precedente implementazione, basata sulla funzione:
516516

517517
```js run
518518
function delay(f, ms) {
@@ -558,9 +558,9 @@ alert(sayHi.length); // 0 (nella dichiarazione del wrapper, ci sono zero argomen
558558
*/!*
559559
```
560560

561-
Il `proxy` è molto più potente, poiché inoltra tutto all'oggeto target.
561+
Il `proxy` è molto più potente, poiché inoltra tutto all'oggetto target.
562562

563-
Utiizziamo il `Proxy` piuttosto della funzione di wrapping:
563+
Utilizziamo il `Proxy` piuttosto della funzione di wrapping:
564564

565565
```js run
566566
function delay(f, ms) {
@@ -653,7 +653,7 @@ user.name = "Pete"; // mostra "SET name=Pete"
653653
Qui:
654654

655655
- `Reflect.get` legge una proprietà di un oggetto.
656-
- `Reflect.set` scrive una proprietà di un oggetto e ritorna `true` se quest avviene con succesos, `false` altrimenti.
656+
- `Reflect.set` scrive una proprietà di un oggetto e ritorna `true` se quest avviene con successo, `false` altrimenti.
657657

658658
Questo è tutto, piuttosto semplice: se una trappola vuole inoltrare l'invocazione all'oggetto, è sufficiente invocare `Reflect.<method>` con gli stessi argomenti.
659659

@@ -733,7 +733,7 @@ Il problema sta quindi nel proxy, alla riga `(*)`.
733733

734734
Per evitare questo, abbiamo bisogno di `receiver`, il terzo argomento della trappola `get`. Questo fa riferimento al `this` corretto, quello che deve essere passato al getter. Nel nostro caso `admin`.
735735

736-
Come possiamo passare il contensto per un getter? Per una funzione regolare potremmo usare `call/apply`, ma questo è un getter, non viene "invocato", ma vi si accede semplicemenete.
736+
Come possiamo passare il contesto per un getter? Per una funzione regolare potremmo usare `call/apply`, ma questo è un getter, non viene "invocato", ma vi si accede semplicemente.
737737

738738
`Reflect.get` fa al caso nostro. Tutto funzionerà correttamente se ne facciamo uso.
739739

@@ -783,7 +783,7 @@ Quindi, `return Reflect...` è un modo sicuro e banale per inoltrare le operazio
783783

784784
## Limitazioni del proxy
785785

786-
I proxy forniscono un modo unico per alterare o aggirare il comportamentoa basso livello degli oggetti esistenti. Non è comunque perfetto. Ha delle limitazioni.
786+
I proxy forniscono un modo unico per alterare o aggirare il comportamento a basso livello degli oggetti esistenti. Non è comunque perfetto. Ha delle limitazioni.
787787

788788
### Oggetti integrati: slot interni
789789

@@ -832,7 +832,7 @@ Ora funziona senza problemi, poiché la trappola `get` si lega alle proprietà d
832832
A differenza dell'esempio precedente, il valore di `this` all'interno di `proxy.set(...)` non sarà `proxy`, ma piuttosto sarà l'oggetto originale `map`. Quindi quando l'implementazione interna di `set` proverà ad accedere allo slot interno `this.[[MapData]]`, l'operazione avverrà con successo.
833833

834834
```smart header="`Array` non possiede slot interni"
835-
Un'eccezione degna di nota: l'oggetto integrato `Array` non utilizza slot interni. Questo per ragioni storiche, poiché esistono da moltop tempo.
835+
Un'eccezione degna di nota: l'oggetto integrato `Array` non utilizza slot interni. Questo per ragioni storiche, poiché esistono da molto tempo.
836836

837837
Quindi non avremo nessun problema nel creare proxy per un array.
838838
```
@@ -924,7 +924,7 @@ I proxy possono intercettare molti operatori, come `new` (con `construct`), `in`
924924

925925
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.
926926

927-
Quindi tutte le operazioni ed le classi integrate che verificano l'uguaglianza tra oggetti differenezieranno l'oggetto dal suo proxy. Non c'è alcun sistema di sostituzione "trasparente" in questo caso.
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.
928928
```
929929
930930
## Proxy revocabili
@@ -933,7 +933,7 @@ Un proxy *revocabile* è un proxy che può essere disabilitato.
933933
934934
Ipotizziamo di avere una risorsa, di cui vorremo poter bloccare gli accessi in qualsiasi momento.
935935
936-
Quello che possiamo fare è creare un proxy *revocabile*, senza alcuna trappola. Un proxy di questo tipo, inoltrerà tutte le operazioni all'oggetto originale, e possiamo disabialitarlo in ogni momento.
936+
Quello che possiamo fare è creare un proxy *revocabile*, senza alcuna trappola. Un proxy di questo tipo, inoltrerà tutte le operazioni all'oggetto originale, e possiamo disabilitarlo in ogni momento.
937937
938938
La sintassi da utilizzare è la seguente:
939939
@@ -968,7 +968,7 @@ Inizialmente, `revoke` è separato da `proxy`, in questo modo possiamo passare
968968

969969
Possiamo anche legare il metodo `revoke` al proxy, impostando `proxy.revoke = revoke`.
970970

971-
Un'altra opzione è quela di creare una `WeakMap` che possiede il `proxy` come chiave e il corrispondente `revoke` come valore, questo consente di trovare facilemente il `revoke` per un proxy:
971+
Un'altra opzione è quella di creare una `WeakMap` che possiede il `proxy` come chiave e il corrispondente `revoke` come valore, questo consente di trovare facilmente il `revoke` per un proxy:
972972

973973
```js run
974974
*!*
@@ -990,7 +990,7 @@ revoke();
990990
alert(proxy.data); // Errore (revocato)
991991
```
992992

993-
In questo casol, utilizziamo una `WeakMap` piuttosto di `Map` in modo che non blocchi il processo di garbage collection. Se un proxy diventa "irragiungibile" (e.g. nessuna variabile fa riferimento ad esso), `WeakMap` consente di rimuoverlo dalla memoria insieme al relativo `revoke` che non sarà più necessario.
993+
In questo casol, utilizziamo una `WeakMap` piuttosto di `Map` in modo che non blocchi il processo di garbage collection. Se un proxy diventa "irraggiungibile" (e.g. nessuna variabile fa riferimento ad esso), `WeakMap` consente di rimuoverlo dalla memoria insieme al relativo `revoke` che non sarà più necessario.
994994

995995
## Riferimenti
996996

@@ -1001,7 +1001,7 @@ In questo casol, utilizziamo una `WeakMap` piuttosto di `Map` in modo che non bl
10011001

10021002
Il `Proxy` è un contenitore per un oggetto, che inoltra tutte le operazioni su di esso all'oggetto originale, e consente di definire delle "trappole" per determinate operazioni.
10031003

1004-
E' possile creare un proxy per qualsiasi tipo di oggetto, incluse le classi e le funzioni.
1004+
E' possibile creare un proxy per qualsiasi tipo di oggetto, incluse le classi e le funzioni.
10051005

10061006
La sintassi da utilizzare è la seguente:
10071007

@@ -1019,7 +1019,7 @@ Possiamo intercettare:
10191019
- Operatore `new` (trappola `construct`).
10201020
- Molte altre operazioni (puoi trovare la lista completa a inizio articolo e nella [documentazione](mdn:/JavaScript/Reference/Global_Objects/Proxy)).
10211021

1022-
Questo ci consente di creare proprietà e motodi "virtuali", implementare valori di default, oggetti observables, decorators e molto altro.
1022+
Questo ci consente di creare proprietà e metodi "virtuali", implementare valori di default, oggetti observables, decorators e molto altro.
10231023

10241024
Possiamo anche costruire proxy multipli di un oggetto, decorandolo con divers e funzionalità.
10251025

@@ -1028,6 +1028,6 @@ L'API [Reflect](mdn:/JavaScript/Reference/Global_Objects/Reflect) è stata proge
10281028
I proxy hanno però delle limitazioni:
10291029

10301030
- Gli oggetti integrati possiedono degli "slot interni", ma l'accesso a questi non può essere intercettato dai proxy. Guardate il workaround descritto sopra.
1031-
- Lo stesso vale per i campi privati della classe, questi vengono implementati internametne utilizzando gli slot. Quindi le invocazioni dei metodi tramite proxy, devono possedere il target object asseganto a `this` per potervi accedere.
1031+
- Lo stesso vale per i campi privati della classe, 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.
10321032
- I test di uguaglianza `===` non possono essere intercettati.
10331033
- 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

Comments
 (0)