Skip to content

Commit 0fc1225

Browse files
longo-andreapasor1
andauthored
Apply suggestions from code review
Co-authored-by: Simone Pasini <66781510+pasor1@users.noreply.github.com>
1 parent 687da0c commit 0fc1225

File tree

5 files changed

+22
-22
lines changed

5 files changed

+22
-22
lines changed

1-js/99-js-misc/01-proxy/01-error-nonexisting/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Questo può aiutare a trovare errori di programmazione in anticipo.
88

99
Scrivete una funzione `wrap(target)` che prende un oggetto `target` e ne ritorna un proxy con la funzionalità appena descritta.
1010

11-
Così è come dovrebbbe funzionare:
11+
Ecco come dovrebbe funzionare:
1212

1313
```js
1414
let user = {

1-js/99-js-misc/01-proxy/02-array-negative/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ array = new Proxy(array, {
66
get(target, prop, receiver) {
77
if (prop < 0) {
88
// anche se vi accediamo come arr[1]
9-
// prop è una stringa, quindi dobbiamo convertirla a number
9+
// prop è una stringa, quindi dobbiamo convertirla a number
1010
prop = +prop + target.length;
1111
}
1212
return Reflect.get(target, prop, receiver);

1-js/99-js-misc/01-proxy/02-array-negative/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ In altre parole, `array[-N]` equivale a `array[array.length - N]`.
1717

1818
Create un proxy che implementa questa funzionalità.
1919

20-
Così è come dovrebbe funzionare:
20+
Ecco come dovrebbe funzionare:
2121

2222
```js
2323
let array = [1, 2, 3];
@@ -29,5 +29,5 @@ array = new Proxy(array, {
2929
alert( array[-1] ); // 3
3030
alert( array[-2] ); // 2
3131

32-
// Le altre funzionalità dell'array devono rimanere tali
32+
// Le altre funzionalità dell'array devono rimanere inalterate
3333
```

1-js/99-js-misc/01-proxy/03-observable/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
Create una funzione `makeObservable(target)` che "rende l'oggetto osservabile" ritornandone un proxy.
55

6-
Così è come dovrebbe funzionare:
6+
Ecco come dovrebbe funzionare:
77

88
```js run
99
function makeObservable(target) {

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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 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.
8585
```
8686

8787
Vediamo come funzionano con esempi pratici.
@@ -139,7 +139,7 @@ alert( dictionary['Hello'] ); // Hola
139139
alert( dictionary['Welcome'] ); // undefined
140140
```
141141

142-
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`.
143143

144144
Per farlo, costruiremo un contenitore per `dictionary` con un proxy che intrecetterà le operazioni di lettura:
145145

@@ -162,7 +162,7 @@ dictionary = new Proxy(dictionary, {
162162
}
163163
});
164164

165-
// Cerchiamo un termine casuale nel dictionary!
165+
// Cerchiamo un termine nel dictionary!
166166
// Nel peggiore dei casi, questo non sarà tradotto.
167167
alert( dictionary['Hello'] ); // Hola
168168
*!*
@@ -177,12 +177,12 @@ Da notare come il proxy sovrascrive la variabile:
177177
dictionary = new Proxy(dictionary, ...);
178178
```
179179
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.
181181
````
182182

183183
## Validazione con la trappola "set"
184184

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.
186186

187187
La "trappola" `set` si innesca quando si accede in scrittura ad una proprietà.
188188

@@ -224,7 +224,7 @@ numbers.push("test"); // TypeError ('set' di proxy ha ritornato false)
224224
alert("This line is never reached (error in the line above)");
225225
```
226226

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.
228228

229229
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.
230230

@@ -245,12 +245,12 @@ I cicli `Object.keys`, `for..in` e molti altri metodi che iterano sulle propriet
245245
Questi metodi si distinguono per alcuni dettagli:
246246
- `Object.getOwnPropertyNames(obj)` ritorna le chiavi non-symbol.
247247
- `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.
250250
251251
...Ma tutti questi incominciamo dalla stessa lista.
252252
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 `_`:
254254
255255
```js run
256256
let user = {
@@ -270,7 +270,7 @@ user = new Proxy(user, {
270270
// "ownKeys" filtra _password, saltandolo
271271
for(let key in user) alert(key); // name, then: age
272272
273-
// abbiamo lo stesso effetto in questi meotodi:
273+
// abbiamo lo stesso effetto in questi metodi:
274274
alert( Object.keys(user) ); // name,age
275275
alert( Object.values(user) ); // John,30
276276
```
@@ -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 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.
297297

298298
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`.
299299

@@ -324,7 +324,7 @@ Ripetiamolo una volta ancora: è sufficiente intercettare `[[GetOwnProperty]]` s
324324

325325
## Proprietà protette da "deleteProperty" e altre trappole
326326

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.
328328

329329
Anche se rimane tecnicamente possibile accedervi:
330330

@@ -337,7 +337,7 @@ let user = {
337337
alert(user._password); // secret
338338
```
339339

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 `_`.
341341

342342
Avremo bisogno delle seguenti trappole:
343343
- `get` per ritornare un errore nel tentativo di accedere a questa proprietà,
@@ -474,7 +474,7 @@ La trappola `has` intercetta le invocazioni di `in`.
474474
- `target` -- è l'oggetto target, passato come primo argomento in `new Proxy`,
475475
- `property` -- nome della proprietà
476476

477-
Qui vediamo la demo:
477+
Qui vediamo una dimostrazione:
478478

479479
```js run
480480
let range = {
@@ -725,7 +725,7 @@ Ma se rimuoviamo il proxy, tutto funziona correttamente.
725725

726726
Il problema sta quindi nel proxy, alla riga `(*)`.
727727

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.
729729
2. Il prototype è `userProxy`.
730730
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 `(*)`.
731731

@@ -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 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.
928928
```
929929
930930
## Proxy revocabili
@@ -1029,5 +1029,5 @@ 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.
10311031
- 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.
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)