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
Questo avviene perché le regole che impostano `this` non guardano agli oggetti letterali.
18
18
19
-
Qui il valore di `this` dentro `makeUser()` è `undefined`, perchè viene chiamato come una funzione, non come un metodo.
19
+
Qui il valore di `this` dentro `makeUser()` è `undefined`, perché viene chiamato come una funzione, non come un metodo.
20
20
21
21
E gli oggetti letterali non hanno alcun effetto su `this`. Il valore di `this` è unico per tutta la funzione, quindi i blocchi di codice e gli oggetti letterali non hanno alcuna importanza.
22
22
23
23
Quindi `ref: this` prende il `this` della funzione.
24
24
25
-
<<<<<<< HEAD
26
-
Qui abbiamo il caso opposto:
27
-
=======
28
-
We can rewrite the function and return the same `this` with `undefined` value:
25
+
Possiamo riscrivere la funzione e ritornare lo stesso `this` con valore `undefined`:
29
26
30
27
```js run
31
28
functionmakeUser(){
32
-
returnthis; //this time there's no object literal
29
+
returnthis; //questa volta non c'e' un oggetto letterale
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/04-object-methods/article.md
+6-138Lines changed: 6 additions & 138 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -32,19 +32,11 @@ user.sayHi = function() {
32
32
user.sayHi(); // Hello!
33
33
```
34
34
35
-
<<<<<<< HEAD
36
35
Qui abbiamo appena utilizzato un espressione di funzione per creare una funzione ed assegnarla alla proprietà `user.sayHi` dell'oggetto.
37
36
38
37
Successivamente possiamo chiamarla. Ora l'utente potrà parlare!
39
38
40
39
Una funzione che è una proprietà di un oggetto si chiama *metodo*.
41
-
=======
42
-
Here we've just used a Function Expression to create a function and assign it to the property `user.sayHi` of the object.
43
-
44
-
Then we can call it as `user.sayHi()`. The user can now speak!
45
-
46
-
A function that is a property of an object is called its *method*.
47
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
48
40
49
41
Quindi, nell'esempio abbiamo un metodo `sayHi` per l'oggetto `user`.
50
42
@@ -56,7 +48,7 @@ let user = {
56
48
};
57
49
58
50
*!*
59
-
// prima la dichiaramo
51
+
// prima la dichiariamo
60
52
functionsayHi() {
61
53
alert("Hello!");
62
54
};
@@ -68,17 +60,10 @@ user.sayHi = sayHi;
68
60
user.sayHi(); // Hello!
69
61
```
70
62
71
-
<<<<<<< HEAD
72
63
```smart header="Programmazione orientata agli oggetti"
73
64
Quando scriviamo codice utilizzando gli oggetti per rappresentare le entità, questa viene definita [programmazione orientata agli oggetti](https://en.wikipedia.org/wiki/Object-oriented_programming), in breve: "OOP".
74
65
75
66
OOP è una grande cosa, un ambito di interesse con i propri studi. Come scegliere le giuste entità? Come organizzare le interazioni tra loro? Questa è l'architettura di un codice, e ci sono molti libri importanti che trattano questo argomento, come "Design Patterns: Elements of Reusable Object-Oriented Software" di E.Gamma, R.Helm, R.Johnson, J.Vissides oppure "Object-Oriented Analysis and Design with Applications" di G.Booch, e molti altri.
76
-
=======
77
-
```smart header="Object-oriented programming"
78
-
When we write our code using objects to represent entities, that's called [object-oriented programming](https://en.wikipedia.org/wiki/Object-oriented_programming), in short: "OOP".
79
-
80
-
OOP is a big thing, an interesting science of its own. How to choose the right entities? How to organize the interaction between them? That's architecture, and there are great books on that topic, like "Design Patterns: Elements of Reusable Object-Oriented Software" by E. Gamma, R. Helm, R. Johnson, J. Vissides or "Object-Oriented Analysis and Design with Applications" by G. Booch, and more.
81
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
82
67
```
83
68
### La forma breve dei metodi
84
69
@@ -175,28 +160,18 @@ let user = {
175
160
let admin = user;
176
161
user =null; // sovrascriviamo per rendere tutto più ovvio
177
162
178
-
<<<<<<<HEAD
179
-
admin.sayHi(); // Whoops! all'interno di sayHi(), viene utilizzato il vecchio name! Errore!
180
-
=======
181
163
*!*
182
-
admin.sayHi(); //TypeError: Cannot read property 'name' of null
164
+
admin.sayHi(); //Errore: non possiamo leggere la proprietà 'name' di null
183
165
*/!*
184
-
>>>>>>>872cc6adedac4ff3ebec73916bf435f1d72f2864
185
166
```
186
167
187
168
Se scriviamo `this.name` piuttosto di `user.name` all'interno di `alert`, il codice funzionerà.
188
169
189
170
## "this" non ha limiti
190
171
191
-
<<<<<<< HEAD
192
-
In JavaScript, la parola chiave "this" si comporta diversamente da molti altri linguaggi di programmazione. Primo, può essere utilizzata in ogni funzione.
172
+
In JavaScript, la parola chiave "this" si comporta diversamente da molti altri linguaggi di programmazione. Essa può essere usata in qualsiasi funzione, anche se non si tratta di un metodo di un oggetto.
193
173
194
174
Non c'è alcun errore di sintassi in un codice come questo:
195
-
=======
196
-
In JavaScript, keyword `this` behaves unlike most other programming languages. It can be used in any function, even if it's not a method of an object.
197
-
198
-
There's no syntax error in the following example:
199
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
200
175
201
176
```js
202
177
functionsayHi() {
@@ -247,127 +222,20 @@ In questo caso `this` è `undefined` in modalità strict. Se tentiamo di accede
247
222
248
223
Se non è attiva la modalità strict (quindi se ci dimentichiamo `use strict`) il valor di `this` in questo sarà *l'oggetto globale* (`window` in un browser, lo studieremo più avanti nel capitolo [](info:global-object)). Questo strano comportamento ha delle motivazioni storiche, che `"use strict"` risolve.
249
224
250
-
<<<<<<< HEAD
251
-
Va detto che solitamente una chiamata a funzione che utilizza `this` senza un oggetto non è comune, nella maggior part dei casi è un errore di programmazione. Se una funzione utilizza `this`, ha senso che venga invocata nel contesto di un oggetto.
252
-
=======
253
-
Usually such call is a programming error. If there's `this` inside a function, it expects to be called in an object context.
225
+
Solitamente questo tipo di chiamate rappresenta un errore di programmazione. Se c'è un `this` all'interno di una funzione, ci si aspetta che sia chiamato nel contesto di un oggetto.
254
226
````
255
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
256
227
257
228
```smart header="Le conseguenze della libertà di `this`"
258
229
Se avete utilizzato altri linguaggi di programmazione, probabilmente la vostra idea è di un "`this` limitato", quando viene definito un metodo in un oggetto questo avrà sempre in `this` il riferimento all'oggetto.
259
230
260
-
<<<<<<< HEAD
261
231
In JavaScript `this` è "libero", il suo valore viene prelevato durante l'esecuzione e non dipende da dove il metodo è stato definito, ma piuttosto dall'oggetto "prima del punto".
262
232
263
-
Il concetto di valutare `this` durante l'esecuzione ha i suoi pregi e difetti. Da una parte una funzione può essere riutilizzata per oggetti diversi. Questa grande flessibilità può essere fonte di molti errori.
264
-
265
-
In questa guida non vogliamo giudicare le scelte di design effettuate. Ci concentriamo su come le cose funzionano, come trarre benefici ed evitare errori.
266
-
```
267
-
268
-
## Le parti interne: il tipo riferimento
269
-
270
-
```warn header="Caratteristiche del linguaggio più profonde"
271
-
Questa sezione coprirà un argomento avanzato, per poter capire meglio alcuni casi limite.
272
-
273
-
Se volete potete saltare questa sezione o posticiparne la lettura.
274
-
```
275
-
276
-
Una chiamata complessa può perde `this`, ad esmpio:
277
-
278
-
```js run
279
-
let user = {
280
-
name: "John",
281
-
hi() { alert(this.name); },
282
-
bye() { alert("Bye"); }
283
-
};
284
-
285
-
user.hi(); // John (la chiamata semplice funzione)
286
-
287
-
*!*
288
-
// ora proviamo a chiamare user.hi o user.bye in base a name
Perché? Se voglia capire perché accade questo, dobbiamo capire come funziona la chiamata `obj.method()`.
310
-
311
-
Guardandola da più vicino, possiamo notare due operazioni in `obj.method()`:
312
-
313
-
1. Prima, il punto `'.'` ritorna la proprietà `obj.method`.
314
-
2. Poi la parentesi `()` la esegue.
315
-
316
-
Quindi, come vengono passate le informazioni riguardo `this` dalla prima alla seconda parte?
317
-
318
-
Se poniamo queste operazioni in due righe separate, allora `this` verrà certamente perso:
319
-
320
-
```js run
321
-
let user = {
322
-
name: "John",
323
-
hi() { alert(this.name); }
324
-
}
325
-
326
-
*!*
327
-
// preleviamo la funzione e la invochiamo successivamente
328
-
let hi = user.hi;
329
-
hi(); // Errore, perhcé this è undefined
330
-
*/!*
331
-
```
332
-
333
-
Qui `hi = user.hi` mette la funzione nella variabile, e nella riga successiva viene chiamata da sola, non c'è nessun `this`.
334
-
335
-
**Per rendere funzionante `user.hi()`, JavaScript usa un trucco -- il punto `'.'` non ritorna una funzione, ma un speciale valore di [tipo riferimento](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
336
-
337
-
Il tipo riferimento è un "tipo specifico". Noi non possiamo utilizzarlo esplicitamente, viene usato internamente dal linguaggio.
338
-
339
-
Il valore del tipo riferimento è una combinazione di tre valori `(base, name, strict)`, dove:
340
-
341
-
- `base` è l'oggetto.
342
-
- `name` è la proprietà.
343
-
- `strict` è vero se `use strict` è attivo.
344
-
345
-
Il risultato dell'accesso ad un proprietà `user.hi` non è una funzione, ma un valore di tipo riferimento. Per `user.hi` con la modalità strict attiva:
346
-
347
-
```js
348
-
// Reference Type value
349
-
(user, "hi", true)
350
-
```
351
-
352
-
Quando le parentesi `()` vengono chiamate sul tipo riferimento, queste ricevono le informazioni riguardo l'oggetto e i suoi metodi, e possono settare il `this` (`=user` in questo caso).
353
-
354
-
Qualsiasi operazione come l'assegnazione `hi = user.hi` scartano il tipo riferimento, prendono il valore di `user.hi` (una funzione) e lo ritornano per l'assegnazione. Quindi qualsiasi operazione ulteriore sul tipo riferimento perde il `this`.
355
-
356
-
Quindi il valore `this` viene passato solamente chiamando la funzione direttamente usando la notazione puntata `obj.method()` o le parentesi quadre `obj['method']()` (vanno bene entrambe). Più avanti in questa guida, studieremo vari modi per risolvere il problema come [func.bind()](/bind#solution-2-bind).
357
-
358
-
## Le funzioni freccia non hanno "this"
359
-
360
-
Le funzioni freccia sono speciali: non hanno un proprio `this`. Se proviamo a riferirci a `this` all'interno di una funzione di questo tipo, verrà preso dal contesto esterno.
361
-
=======
362
-
In JavaScript `this` is "free", its value is evaluated at call-time and does not depend on where the method was declared, but rather on what object is "before the dot".
363
-
364
-
The concept of run-time evaluated `this` has both pluses and minuses. On the one hand, a function can be reused for different objects. On the other hand, the greater flexibility creates more possibilities for mistakes.
233
+
Il concetto di valutare `this` durante l'esecuzione ha i suoi pregi e difetti. Da una parte una funzione può essere riutilizzata per oggetti diversi, dall'altra questa grande flessibilità può essere fonte di molti errori.
365
234
366
-
Here our position is not to judge whether this language design decision is good or bad. We'll understand how to work with it, how to get benefits and avoid problems.
235
+
La nostra posizione non è di giudicare se questa caratteristica del linguaggio sia buona o cattiva, ma si tratta di capire come lavorare con essa sfruttandone i benefici ed evitando i problemi.
367
236
```
368
237
369
238
## Arrow functions have no "this"
370
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
371
239
372
240
Ad esempio, qui `arrow()` usa `this` preso dal metodo esterno `user.sayHi()`:
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/06-constructor-new/article.md
+5-33Lines changed: 5 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,11 +27,7 @@ alert(user.name); // Jack
27
27
alert(user.isAdmin); // false
28
28
```
29
29
30
-
<<<<<<< HEAD
31
-
Quando una funzione viene eseguita con `new User(...)`, segue questi passaggi:
32
-
=======
33
-
When a function is executed with `new`, it does the following steps:
34
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
30
+
Quando una funzione viene eseguita con `new`, segue questi passaggi:
35
31
36
32
1. Un nuovo oggetto vuoto viene creato ed assegnato a `this`.
37
33
2. Viene eseguito il corpo della funzione. Solitamente questo modifica `this`, aggiungendo nuove proprietà.
@@ -45,7 +41,7 @@ function User(name) {
45
41
// this = {}; (implicito)
46
42
*/!*
47
43
48
-
// aggiungiamo proprietaà a this
44
+
// aggiungiamo proprietà a this
49
45
this.name= name;
50
46
this.isAdmin=false;
51
47
@@ -55,11 +51,7 @@ function User(name) {
55
51
}
56
52
```
57
53
58
-
<<<<<<< HEAD
59
-
Quindi il risultato di `new User("Jack")` è lo stesso oggetto di:
60
-
=======
61
-
So `let user = new User("Jack")` gives the same result as:
62
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
54
+
Quindi `let user = new User("Jack")` dà lo stesso risultato di:
63
55
64
56
```js
65
57
let user = {
@@ -143,12 +135,7 @@ Non è un ottima cosa utilizzare la doppia sintassi ovunque, perché omettendo `
143
135
144
136
Solitamente, i costruttori non hanno l'istruzione `return`. Il loro compito è di eseguire tutto ciò che è necessario a creare l'oggetto lavorando su `this`, quest'ultimo sarà il risultato.
145
137
146
-
<<<<<<< HEAD
147
138
Se decidiamo di inserire un istruzione di `return`, vanno seguite delle semplici regole:
148
-
=======
149
-
- If `return` is called with an object, then the object is returned instead of `this`.
150
-
- If `return` is called with a primitive, it's ignored.
151
-
>>>>>>> 872cc6adedac4ff3ebec73916bf435f1d72f2864
152
139
153
140
- Se `return` viene invocato con un oggetto, questo verrà ritornato al posto di `this`.
154
141
- Se `return` viene invocato con un tipo primitivo, verrà ignorato.
@@ -162,17 +149,10 @@ function BigUser() {
162
149
163
150
this.name="John";
164
151
165
-
<<<<<<<HEAD
166
-
return { name:"Godzilla" }; // <-- ritorna un oggetto
152
+
return { name:"Godzilla" }; // <-- ritorna questo oggetto
167
153
}
168
154
169
-
alert( newBigUser().name ); // Godzilla, preso l'oggetto ^^
170
-
=======
171
-
return { name:"Godzilla" }; // <-- returns this object
172
-
}
173
-
174
-
alert( newBigUser().name ); // Godzilla, got that object
Qui invece abbiamo un esempio con un `return` vuoto (potremmo anche ritornare un qualsiasi valore di tipo primitivo):
@@ -182,19 +162,11 @@ function SmallUser() {
182
162
183
163
this.name="John";
184
164
185
-
<<<<<<<HEAD
186
-
return; // al termine dell'esecuzione, ritorna this
187
165
188
166
// ...
189
167
190
-
=======
191
-
return; // <-- returns this
192
-
>>>>>>>872cc6adedac4ff3ebec73916bf435f1d72f2864
193
168
}
194
169
195
-
alert( newSmallUser().name ); // John
196
-
```
197
-
198
170
Solitamente i costruttori non possiedono l'istruzione `return`. Qui per completezza abbiamo citato gli eventuali comportamenti, se si tenta di ritornare un oggetto.
0 commit comments