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/08-prototypes/01-prototype-inheritance/2-search-algorithm/solution.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,6 +27,6 @@
27
27
alert( table.money ); // undefined
28
28
```
29
29
30
-
2. Nei moderni engine, che valutano leperformance, non c'è alcuna differenza tra il prelevare una proprietà dall'oggetto oppure direttamente dal suo prototype. Sonoin grado di ricordare da dove è stata presa la proprietà e riutilizzarla alla prossima richiesta.
30
+
2. Nei moderni engine, che valutano laperformance, non c'è alcuna differenza tra il prelevare una proprietà dall'oggetto oppure direttamente dal suo prototype. Sonoin grado di ricordare da dove è stata presa la proprietà e riutilizzarla alla prossima richiesta.
31
31
32
-
Ad esempio, per `pockets.glasses`loro ricordano dove hanno trovato `glasses` (in`head`), quindi la prossima volta la cercheranno proprio li. Sono anche abbastanza intelligenti da aggiornare la cache interna nel caso qualcosa cambi, quindi questa ottimizzazione è sicura.
32
+
Ad esempio, per `pockets.glasses` ricordano dove hanno trovato `glasses` (in`head`), quindi la prossima volta la cercheranno proprio li. Sono anche abbastanza intelligenti da aggiornare la cache interna nel caso qualcosa cambi, quindi questa ottimizzazione è sicura.
Copy file name to clipboardExpand all lines: 1-js/08-prototypes/01-prototype-inheritance/4-hamster-proto/solution.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
Guardiamo attentamente a cosa succende nella chiamata `speedy.eat("apple")`.
1
+
Guardiamo attentamente cosa succede nella chiamata `speedy.eat("apple")`.
2
2
3
3
1. Il metodo `speedy.eat` viene trovato nel prototype (`=hamster`), eseguito con `this=speedy` (l'oggetto prima del punto).
4
4
@@ -77,4 +77,4 @@ alert( speedy.stomach ); // apple
77
77
alert( lazy.stomach ); // <nothing>
78
78
```
79
79
80
-
Una soluzione comune, tutte le proprietà che descrivono un particolare stato dell'oggetto, come `stomach`, dovrebbero essere memorizzate nell'oggetto. In questo modo eviteremo il problema.
80
+
Come soluzione comune, tutte le proprietà che descrivono un particolare stato dell'oggetto, come `stomach`, dovrebbero essere memorizzate nell'oggetto. In questo modo eviteremo il problema.
Copy file name to clipboardExpand all lines: 1-js/08-prototypes/01-prototype-inheritance/article.md
+21-21Lines changed: 21 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,22 +1,22 @@
1
1
# Prototypal inheritance
2
2
3
-
Nella programmazione, spesso vogliamo prendere qualcosa ed estenderlo.
3
+
Nella programmazione, spesso vogliamo prendere qualcosa ed estenderla.
4
4
5
5
Ad esempio, potremmo avere un oggetto `user` con le sue proprietà e i suoi metodi, e voler definire gli oggetti `admin` e `guest` come sue varianti. Vorremmo però poter riutilizzare ciò che abbiamo nell'oggetto `user`, evitando di copiare e reimplementare nuovamente i suoi metodi, quindi vorremmo semplicemente definire un nuovo oggetto a partire da esso.
6
6
7
7
La *prototypal inheritance* (ereditarietà dei prototype) è una caratteristica del linguaggio che aiuta in questo senso.
8
8
9
9
## [[Prototype]]
10
10
11
-
In JavaScript, possiedono una speciale proprietà nascosta `[[Prototype]]` (come definito nella specifica), questo può valere `null` oppure può contenere il riferimento ad un altro oggetto. Quell'oggetto viene definito "prototype" (prototipo):
11
+
In JavaScript, gli oggetti possiedono una speciale proprietà nascosta `[[Prototype]]` (come definito nella specifica); questo può valere `null` oppure può contenere il riferimento ad un altro oggetto. Quell'oggetto viene definito "prototype" (prototipo):
12
12
13
13

14
14
15
-
Quando leggiamo una proprietà da `object`, e questa non esiste, JavaScript prova automaticamente a recuperarla dal suo prototype. In programmazione, questo comportamento viene definito "prototypal inheritance". Presto vederemo diversi esempi di questo tipo di ereditarietà, e vedremo anche delle interessanti caratteristiche di linguaggio basate su di essa.
15
+
Quando leggiamo una proprietà da `object`, e questa non esiste, JavaScript prova automaticamente a recuperarla dal suo prototype. In programmazione, questo comportamento viene definito "prototypal inheritance". Presto vederemo diversi esempi di questo tipo di ereditarietà, e vedremo anche delle interessanti caratteristiche del linguaggio basate su di essa.
16
16
17
17
La proprietà `[[Prototype]]` è interna e nascosta, ma esistono diversi modi per poterla impostare.
18
18
19
-
Uno di questi è quello di utilizzare la nomenclatura speciale `__proto__`, in questo modo:
19
+
Uno di questi è quello di utilizzare la nomenclatura speciale `__proto__`:
20
20
21
21
```js run
22
22
let animal = {
@@ -27,7 +27,7 @@ let rabbit = {
27
27
};
28
28
29
29
*!*
30
-
rabbit.__proto__= animal; // imposta il prototy di rabbit,.[[Prototype]] = animal
30
+
rabbit.__proto__= animal; // imposta il prototype di rabbit,.[[Prototype]] = animal
31
31
*/!*
32
32
```
33
33
@@ -60,7 +60,7 @@ Successivamente, quando `alert` proverà a leggere la proprietà `rabbit.eats` `
60
60
61
61

62
62
63
-
In questo caso possiamo dire che "`animal` è il prototype di `rabbit`" o, in alternativa, che "`rabbit` prototypically inherits (eredità dal prototipo) da `animal`"
63
+
In questo caso possiamo dire che "`animal` è il prototype di `rabbit`" o, in alternativa, che "`rabbit`*prototypically inherits* (eredità dal prototipo) da `animal`"
64
64
65
65
Quindi se `animal` possiede molte proprietà e metodi utili, questi saranno automaticamente disponibili in `rabbit`. Queste proprietà vengono definite come "ereditate".
66
66
@@ -127,9 +127,9 @@ Ora, se provassimo a leggere qualcosa da `longEar`, e non esistesse, JavaScript
127
127
Ci sono solamente due limitazioni:
128
128
129
129
1. Non possono esserci riferimenti circolari. JavaScript lancerebbe un errore se provassimo ad assegnare a `__proto__` un riferimento circolare.
130
-
2. Il valore di `__proto__` può essere o un oggetto o `null`. Gli altri valore vengono ignorati.
130
+
2. Il valore di `__proto__` può essere o un oggetto o `null`. Gli altri valori vengono ignorati.
131
131
132
-
Inoltre, anche se dovrebbe essere già ovvio: può esserci solamente un `[[Prototype]]`. Un oggetto non può eridatare da più oggetti.
132
+
Inoltre, anche se dovrebbe essere già ovvio: può esserci solamente un `[[Prototype]]`. Un oggetto non può ereditare da più oggetti.
133
133
134
134
135
135
```smart header="`__proto__` è un getter/setter storico per `[[Prototype]]`"
@@ -141,7 +141,7 @@ La proprietà `__proto__` è leggermente datata. Esiste solamente per ragioni st
141
141
142
142
Secondo la specifica, `__proto__` deve essere supportato solamente dai browser. In realtà, tutti gli ambienti, inclusi quelli server-side, supportano `__proto__`, quindi il suo utilizzo è piuttosto sicuro.
143
143
144
-
Poichè la notazione `__proto__` risulta essere più intuitiva, la utilizzeremo nei nostri esempi.
144
+
Poiché la notazione `__proto__` risulta essere più intuitiva, la utilizzeremo nei nostri esempi.
145
145
```
146
146
147
147
## La scrittura non utilizza prototype
@@ -150,7 +150,7 @@ Il prototype viene utilizzato solamente per la lettura delle proprietà.
150
150
151
151
Le operazioni di scrittura/rimozione utilizzano direttamente l'oggetto.
152
152
153
-
Nell'esempio che vediamo sotto, assegniamo un suo metodo `walk` a `rabbit`:
153
+
Nell'esempio che vediamo sotto, assegniamo un metodo `walk` a `rabbit`, che sarà solo suo:
154
154
155
155
```js run
156
156
let animal = {
@@ -209,21 +209,21 @@ alert(admin.fullName); // Alice Cooper, lo stato di admin è stato modificato
209
209
alert(user.fullName); // John Smith, lo stato di user è protetto
210
210
```
211
211
212
-
Nell'esempio in linea `(*)` la proprietà `admin.fullName`possiede un getter nel prototype `user`, quindi viene invocato. In linea `(**)` la proprietà ha un setter nel prototype, che viene quindi invocato.
212
+
Nell'esempio in linea `(*)` la proprietà `admin.fullName`ha un getter nel prototype `user`, quindi viene invocato. In linea `(**)` la proprietà ha un setter nel prototype, che viene quindi invocato.
213
213
214
214
## Il valore di "this"
215
215
216
-
Dall'esempio sopra potrebbe sorgere una domanda interessante: qual'è il valore di `this` all'interno `set fullName(value)`? Dove vengono scritte le proprietà `this.name` e `this.surname`: in `user` o `admin`?
216
+
Dall'esempio sopra potrebbe sorgere una domanda interessante: qualè il valore di `this` all'interno `set fullName(value)`? Dove vengono scritte le proprietà `this.name` e `this.surname`: in `user` o `admin`?
217
217
218
218
La risposta è semplice: `this` non viene influenzato dai prototype.
219
219
220
-
**Non ha importanza dove viene trovato il metodo: nell'oggetto o in un suo prototupe. Quando invochiamo un metodo, `this` fa sempre riferimento all'oggetto che precede il punto.**
220
+
**Non ha importanza dove viene trovato il metodo: nell'oggetto o in un suo prototype. Quando invochiamo un metodo, `this` fa sempre riferimento all'oggetto che precede il punto.**
221
221
222
222
Quindi, l'invocazione del setter `admin.fullName=` utilizza `admin` come `this`, non `user`.
223
223
224
-
Questo è molto importante, poiché potremmo avere un oggetto molto grande con molti metodi, e avere diversi oggetti che ereditano da esso. Quando gli oggetti che ereditano, eseguono un metodo ereditato, andranno a modificare solamente il loro stato, non quello dell'oggetto principale.
224
+
Questo è molto importante, poiché potremmo avere un oggetto molto grande con molti metodi, e avere diversi oggetti che ereditano da esso. Quando gli oggetti che ereditano eseguono un metodo ereditato, andranno a modificare solamente il loro stato, non quello dell'oggetto principale da cui ereditano.
225
225
226
-
Ad esempio, qui `animal` rappresenta un "memorizzato di metodi", che `rabbit` utilizza.
226
+
Ad esempio, qui `animal` rappresenta un "archivio di metodi", che `rabbit` utilizza.
227
227
228
228
La chiamata `rabbit.sleep()` imposta `this.isSleeping` nell'oggetto `rabbit`:
229
229
@@ -256,9 +256,9 @@ Il risultato:
256
256
257
257

258
258
259
-
Se avessimo altri oggetti, come `bird`, `snake`, etc., che ereditano da `animal`, avrebbero a loro volta accesso ai metodi di `animal`. In ogni caso, `this` all'interno della chiamata, farebbere riferimento all'oggetto corrispondente, che viene valutato al momento dell'invocazione (appena prima del punto), e non ad `animal`. Quindi quando scriviamo dati utilizzando `this`, questi verranno memorizzati nell'oggetto corrispondente.
259
+
Se avessimo altri oggetti, come `bird`, `snake`, etc., che ereditano da `animal`, avrebbero a loro volta accesso ai metodi di `animal`. In ogni caso, `this` all'interno della chiamata farebbe riferimento all'oggetto corrispondente, che viene valutato al momento dell'invocazione (appena prima del punto), e non ad `animal`. Quindi quando scriviamo dati utilizzando `this`, questi verranno memorizzati nell'oggetto corrispondente.
260
260
261
-
Come risultato otteniamo che dei metodi condivisi, mentre lo stato degli oggetti non lo è.
261
+
Come risultato i metodi sono condivisi, mentre lo stato degli oggetti non lo è.
// il ciclo for..in itera sia le proprietà di rabbi, che quelle ereditate da animal
285
+
// il ciclo for..in itera sia le proprietà di rabbit, che quelle ereditate da animal
286
286
for(let prop in rabbit) alert(prop); // jumps, then eats
287
287
*/!*
288
288
```
289
289
290
-
Se questo non è ciò che ci aspettiamo, e voglia escludere le proprietà ereditate, esiste un metodo integrato [obj.hasOwnProperty(key)](mdn:js/Object/hasOwnProperty): ritorna `true` se `obj` possiede la proprietà `key`come non ereditata (propria).
290
+
Se questo non è ciò che ci aspettiamo, e voglia escludere le proprietà ereditate, esiste un metodo integrato [obj.hasOwnProperty(key)](mdn:js/Object/hasOwnProperty): ritorna `true` se `obj` possiede la propria proprietà `key`(non ereditata).
291
291
292
-
Quindi possiamo filtrare le proprietà ereditate (o farci qualcosaltro):
292
+
Quindi possiamo filtrare le proprietà ereditate (o farci qualcos'altro):
293
293
294
294
```js run
295
295
let animal = {
@@ -334,6 +334,6 @@ Questi metodi lavorano solamente sull'oggetto stesso. Le proprietà di prototype
334
334
- Possiamo utilizzare `obj.__proto__` per accedervi (una proprietà getter/setter storica, ci sono altri modi che vederemo presto).
335
335
- L'oggetto a cui fa riferimento `[[Prototype]]` viene chiamato "prototype".
336
336
- Se vogliamo leggere una proprietà di `obj` o invocare un metodo, ma questo non esiste, allora JavaScript andrà a cercarlo nel prototype.
337
-
- Le operazioni di scrittrua/rimozione agiscono direttamente nell'oggetto, non utilizzano il prototype (assumendo che questa sia una proprietà e non un setter).
337
+
- Le operazioni di scrittura/rimozione agiscono direttamente sull'oggetto, non utilizzano il prototype (assumendo che questa sia una proprietà e non un setter).
338
338
- Se invochiamo `obj.method()`, e il `method` viene prelevato dal prototype, `this` farà comunque riferimento a `obj`. Quindi i metodi lavoreranno sempre con l'oggetto corrente, anche se questi sono ereditati.
339
339
- Il ciclo `for..in` itera sia le proprietà dell'oggetto che quelle ereditate. Tutti gli altri metodi di tipo getter key/value operano solamente sull'oggetto stesso.
0 commit comments