Skip to content

Commit ec3bdcc

Browse files
longo-andreaDorin-Davidpasor1
authored
Apply suggestions from code review
Co-authored-by: Dorin-David <70648503+Dorin-David@users.noreply.github.com> Co-authored-by: Simone Pasini <66781510+pasor1@users.noreply.github.com>
1 parent a436150 commit ec3bdcc

File tree

3 files changed

+23
-23
lines changed

3 files changed

+23
-23
lines changed

1-js/08-prototypes/04-prototype-methods/2-dictionary-tostring/solution.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
Il metodo `Object.keys` stampa tutte le proprietà enumerable di un oggetto.
2+
Il metodo `Object.keys` mostra tutte le proprietà enumerabili di un oggetto.
33

44
Per rendere `toString` non-enumerable, dobbiamo definirlo utilizzando un property descriptor. La sintassi che ci permette di farlo è `Object.create`, che ci consente di fornire dei property descriptors come secondo argomento.
55

@@ -22,10 +22,10 @@ for(let key in dictionary) {
2222
alert(key); // "apple", poi "__proto__"
2323
}
2424

25-
// vengono elencate le proprietà separate da virgola
25+
// vengono elencate le proprietà separate da una virgola
2626
alert(dictionary); // "apple,__proto__"
2727
```
2828

29-
Possiamo crare una proprietà utilizzando un descriptor, le flag vengono impostate a `false` di default. Quindi nel codice sopra, `dictionary.toString` è non-enumerable.
29+
Possiamo crare una proprietà utilizzando un descriptor. Di default i flag vengono impostati a `false`. Quindi nel codice sopra, `dictionary.toString` è non-enumerable.
3030

3131
Vedi il capitolo [property descriptors](info:property-descriptors) se hai bisogno di ripassare l'argomento.

1-js/08-prototypes/04-prototype-methods/2-dictionary-tostring/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Abbiamo un oggetto `dictionary`, creato come `Object.create(null)`, in cui memor
88

99
Aggiungi un metodo `dictionary.toString()`, il quale dovrebbe ritornare un lista di chiavi separate da virgola. Il metodo `toString` non deve essere mostrato nei cicli `for..in`.
1010

11-
Cosi è come dovrebbe funzionare:
11+
Dovrebbe funzionare così:
1212

1313
```js
1414
let dictionary = Object.create(null);
@@ -21,7 +21,7 @@ let dictionary = Object.create(null);
2121
dictionary.apple = "Apple";
2222
dictionary.__proto__ = "test"; // __proto__ è una proprietà comune in questo caso
2323

24-
// visualizziamo solamente apple e __proto__ are nel ciclo
24+
// nel ciclo compaiono solo apple e __proto__
2525
for(let key in dictionary) {
2626
alert(key); // "apple", poi "__proto__"
2727
}

1-js/08-prototypes/04-prototype-methods/article.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Alcuni dei metodi più moderni sono:
1111
- [Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- ritorna il `[[Prototype]]` di `obj`.
1212
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- imposta il `[[Prototype]]` di `obj` a `proto`.
1313

14-
Questi metodi dovrebbero sempre essere preferiti rispetto a `__proto__`.
14+
Questi metodi dovrebbero sempre essere preferiti a `__proto__`.
1515

1616
Ad esempio:
1717

@@ -54,13 +54,13 @@ alert(rabbit.jumps); // true
5454

5555
I descrittori vanno forniti nel formato descritto nel capitolo <info:property-descriptors>.
5656

57-
Possiamo utilizzare `Object.create` per clonare un oggetto in maniera più performante rispetto a copiare le proprietà con un `for..in`:
57+
Possiamo utilizzare `Object.create` per clonare un oggetto in maniera più efficace rispetto al copiare le proprietà con un `for..in`:
5858

5959
```js
6060
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
6161
```
6262

63-
Questa chiamata crea una copia esatta di `obj`, inculdendo tutte le proprietà: enumerable e non-enumerable, tutte le proprietà ed i relativi setters/getters -- tutto, impostando anche il giusto `[[Prototype]]`.
63+
Questa chiamata crea una copia esatta di `obj`, inculdendo tutte le proprietà: enumerable e non-enumerable, e i relativi setters/getters -- tutto, impostando anche il giusto `[[Prototype]]`.
6464

6565
## Una breve storia
6666

@@ -72,16 +72,16 @@ Motivazioni storiche.
7272

7373
- La proprietà `"prototype"` di un costruttore è disponibile fin dai primi tempi in JavaScript.
7474
- Più tardi, nel 2012, è apparso nello standard `Object.create`. Il quale permette di creare oggetti fornendogli un prototype, ma non consente di impostarlo o di ottenerlo. Quindi i browser implementarono il metodo non-standard `__proto__`, come proprietà di accesso per impostare o otternere il prototype in qualsiasi momento.
75-
- Più tardi, nel 2015, `Object.setPrototypeOf` e `Object.getPrototypeOf` vennero aggiunti allo standard, con le stesse funzionalità di `__proto__`. Poiché `__proto__` era di fatto implementato ovunque, entro in un fase di deprecazione, entrando nella sezione Annex B dello standard, ovvero: opzionale per gli ambienti non-browser.
75+
- Più tardi, nel 2015, `Object.setPrototypeOf` e `Object.getPrototypeOf` vennero aggiunti allo standard, con le stesse funzionalità di `__proto__`. Poiché `__proto__` era di fatto implementato ovunque, entrò in un fase di deprecazione, nella sezione Annex B dello standard, ovvero: opzionale per gli ambienti non-browser.
7676

7777
Ad oggi abbiamo molti metodi a nostra disposizione.
7878

79-
Perché `__proto__` è stato rimpiazzato dalle funzioni `getPrototypeOf/setPrototypeOf`? Questa è una domanda interessante, dobbiamo capire perché l'utilizzo di `__proto__` non è una buona pratica. Continuate a leggere per avere la risposta.
79+
Perché `__proto__` è stato rimpiazzato dalle funzioni `getPrototypeOf/setPrototypeOf`? Questa è una domanda interessante; dobbiamo capire perché l'utilizzo di `__proto__` non è una buona pratica. Continuate a leggere per avere la risposta.
8080

8181
```warn header="Non cambiate il `[[Prototype]]` ad oggetti esistenti se la velocità è importante"
8282
Tecnicamente, possiamo impostare/ottenere il `[[Prototype]]` in qualsiasi momento. Ma solitamente lo impostiamo in fase di creazione dell'oggetto e successivamente non lo modifichiamo più: `rabbit` eredita da `animal`, e questo non dovrebbe cambiare.
8383

84-
I motori JavaScript sono altamente ottimizzati per questo. Cambiare il prototype "on-the-fly" (al momento), con `Object.setPrototypeOf` o `obj.__proto__=` è un operazione molto lenta, poiché vanifica le ottimizzazioni interne fatte per le operazioni di accesso alle proprietà. Quindi evitate questa pratica, a meno ché non siate consci di ciò che state facendo, e la velocità di esecuzioni non è un problema per voi.
84+
I motori JavaScript sono altamente ottimizzati per questo. Cambiare il prototype durante l'esecuzione, con `Object.setPrototypeOf` o `obj.__proto__=` è un operazione molto lenta, poiché vanifica le ottimizzazioni interne fatte per le operazioni di accesso alle proprietà. Quindi evitate questa pratica, a meno che non siate consci di ciò che state facendo, e la velocità di esecuzione non è un problema per voi.
8585
```
8686
8787
## "Very plain" objects [#very-plain]
@@ -103,13 +103,13 @@ alert(obj[key]); // [object Object], non "some value"!
103103

104104
In questo esempio, se l'utente digita `__proto__`, l'assegnazione è ignorata!
105105

106-
Questo non dovrebbe sorprenderci. La proprietà `__proto__` è speciale: deve contenere un oggetto o valere `null`. Una stringa non può fungere da prototype.
106+
Questo non dovrebbe sorprenderci. La proprietà `__proto__` è speciale: deve contenere un oggetto o `null`. Una stringa non può fungere da prototype.
107107

108108
Ma il nostro *intento* non è quello di implementare questo comportamento, giusto? Vogliamo semplicemente memorizzare una coppia chiave/valore, ma utilizzando come chiave il termine `"__proto__"` questo non viene memorizzato correttamente. Quindi, questo è un bug!
109109

110-
In questo caso le conseguenze non sono cosi terribili. Ma in altri casi potremmo assegnarli oggetti, andando a modificare il valore di prototype. Risultato: l'esecuzione fallirà in maniera imprevedibile.
110+
In questo caso le conseguenze non sono così terribili. Ma in altri casi potremmo assegnarli oggetti, andando a modificare il valore del prototype. Risultato: l'esecuzione fallirà in maniera imprevedibile.
111111

112-
Ancora peggio -- solitamente gli sviluppatori non pensano affatto a questa eventualità. Questo lo rende un bug veramente difficile da trovare e può generare bug con diverse vulnerabilità, specialmente se il codice viene eseguito server-side.
112+
Ancora peggio -- solitamente gli sviluppatori non pensano affatto a questa eventualità. Questo lo rende un bug veramente difficile da trovare e può portare a diverse vulnerabilità, specialmente se il codice viene eseguito server-side.
113113

114114
Questi comportamenti inaspettati accadono anche se proviamo ad assegnare la chiave `toString`, la quale è una funzione di default, e lo stesso vale per gli altri metodi integrati.
115115

@@ -123,11 +123,11 @@ Ma `Object` potrebbe esserci utile, perché i creatori del linguaggio hanno pens
123123

124124
![](object-prototype-2.svg)
125125

126-
Quindi, se `obj.__proto__` viene letta o impostata, il corrispondende getter/setter viene chiamato dal suo prototypeil quale legge/imposta il `[[Prototype]]`.
126+
Quindi, se `obj.__proto__` viene letta o impostata, il corrispondende getter/setter viene chiamato dal suo prototype, il quale legge/imposta il `[[Prototype]]`.
127127

128128
Come detto all'inizio di questa sezione: `__proto__` è un modo per accedere al `[[Prototype]]`, non è il `[[Prototype]]` stesso.
129129

130-
Ora, se il nostro scopo è quello di utilizzare un oggetto come array associativo, e voglia evitare questo tipo di problemi, possiamo farlo in questo modo:
130+
Ora, se il nostro scopo è quello di utilizzare un oggetto come array associativo, e vogliamo evitare questo tipo di problemi, possiamo farlo in questo modo:
131131

132132
```js run
133133
*!*
@@ -144,23 +144,23 @@ alert(obj[key]); // "some value"
144144

145145
![](object-prototype-null.svg)
146146

147-
Quindi, non si ha alcun getter/setter ereditato per `__proto__`. D'ora in poi verrà trattata come una comune proprietà, quindi l'esempio visto sopra, funzionerà senza problemi.
147+
Quindi, non si ha alcun getter/setter ereditato per `__proto__`. D'ora in poi verrà trattata come una comune proprietà; l'esempio visto sopra funzionerà senza problemi.
148148

149149
Questo tipo di oggetti vengono chiamati "very plain" ("molto semplici") o "pure dictionary" ("dizionari puri"), poiché sono molto più semplici dei normali plain object `{...}`.
150150

151-
Il lato negativo di questi oggetti è che mancano di tutti gli oggetti integrati nei metodi, ad esempio `toString`:
151+
Il lato negativo di questi oggetti è che mancano di tutti i metodi integrati, ad esempio `toString`:
152152

153153
```js run
154154
*!*
155155
let obj = Object.create(null);
156156
*/!*
157157

158-
alert(obj); // Error (nnon esiste toString)
158+
alert(obj); // Error (non esiste toString)
159159
```
160160

161161
...Ma questo può andarci bene per gli array associativi.
162162

163-
Da notare che molti dei metodi relativi agli oggetti sono del tipo `Object.something(...)`, come `Object.keys(obj)` -- non sono contenuti all'interno del prototype, quindi continueranno a funzionare anche con questo tipo di oggetti:
163+
Da notare che molti dei metodi relativi agli oggetti sono come `Object.something(...)`, ad esempio `Object.keys(obj)` -- non sono contenuti all'interno del prototype, quindi continueranno a funzionare anche con questo tipo di oggetti:
164164

165165

166166
```js run
@@ -173,13 +173,13 @@ alert(Object.keys(chineseDictionary)); // hello,bye
173173

174174
## Riepilogo
175175

176-
I metodi moderi per impostare e leggere il prototype sono:
176+
I metodi moderni per impostare e leggere il prototype sono:
177177

178178
- [Object.create(proto, [descriptors])](mdn:js/Object/create) -- crea un oggetto vuoto utilizzando `proto` come `[[Prototype]]` (può essere anche `null`) e dei property descriptors (descrittori di proprietà).
179179
- [Object.getPrototypeOf(obj)](mdn:js/Object/getPrototypeOf) -- ritorna il `[[Prototype]]` di `obj` (equivale a `__proto__`).
180180
- [Object.setPrototypeOf(obj, proto)](mdn:js/Object/setPrototypeOf) -- imposta il `[[Prototype]]` di `obj` a `proto` (equivale a `__proto__`).
181181

182-
La proprietà integrata `__proto__`, utilizzata come getter/setter, non è sicura nel caso in cui volessimo inserire in un oggetto chiavi fornite dall'utente. Un utente potrebbe inserire `"__proto__"` come chiave, che genererebbe un errore, potrebbe non avere gravi conseguenze, ma generalmente non è prevedibile.
182+
La proprietà integrata `__proto__`, utilizzata come getter/setter, non è sicura nel caso in cui volessimo inserire in un oggetto chiavi fornite dall'utente. Un utente potrebbe inserire `"__proto__"` come chiave, che genererebbe un errore; potrebbe non avere gravi conseguenze, ma generalmente non è prevedibile.
183183

184184
Le alternative disponibili sono: usare `Object.create(null)` per creare un "very plain" object, senza `__proto__`, o in alternativa, utilizzare `Map`.
185185

@@ -191,7 +191,7 @@ let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescr
191191

192192
Abbiamo anche chiarito che `__proto__` è un getter/setter per `[[Prototype]]` e risiede in `Object.prototype`, proprio come gli altri metodi.
193193

194-
Possiamo creare un oggetto senza prototype utilizzando `Object.create(null)`. Questo tipo di oggetti vengono utilizzati come "pure dictionaries", che non presentano problemi nel caso in cui venga utilizzata `"__proto__"` come chiave.
194+
Possiamo creare un oggetto senza prototype utilizzando `Object.create(null)`. Questo tipo di oggetti vengono utilizzati come "puri dizionari", e non causano problemi nel caso in cui venga utilizzata `"__proto__"` come chiave.
195195

196196
Altri metodi:
197197

0 commit comments

Comments
 (0)