Utilizzare "this" in un oggetto letterale
Qui la funzione makeUser ritorna un oggetto.
Qual è il risultato dell’accesso a ref? Perché?
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); //Qual è il risultato?
Risposta: un errore.
Provate:
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
Questo avviene perché le regole che impostano this non guardano agli oggetti letterali.
Qui il valore di this dentro makeUser() è undefined, perché viene chiamato dentro una funzione, non un metodo.
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 che vi si trovano dentro non hanno alcuna importanza.
Quindi ref: this prende il this della funzione.
Possiamo riscrivere la funzione e ritornare lo stesso this con valore undefined:
function makeUser(){
return this; // questa volta non c'e' un oggetto letterale
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
Come possiamo vedere, il risultato di alert( makeUser().name ) è lo stesso di alert( user.ref.name ) nell’esempio precedente.
Qui abbiamo il caso opposto:
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // John
Ora funziona, perché user.ref() è un metodo. E il valore di this si riferisce all’oggetto prima del punto ..