Utilisation de "this" dans le littéral d'objet
Ici, la fonction makeUser renvoie un objet.
Quel est le résultat de lâaccès à sa ref ? Pourquoi ?
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Quel est le résultat ?
Réponse : une erreur.
Essayez le :
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Erreur: Impossible de lire la propriété 'nom' de undefined
Câest parce que les règles qui définissent this ne prennent pas en compte la définition dâobjet. Seul le moment de lâappel compte.
Ici, la valeur de this à lâintérieur de makeUser() est undefined, car elle est appelée en tant que fonction et non en tant que méthode avec la syntaxe au âpointâ.
La valeur de this est la même pour toute la fonction, les blocs de code et les littéraux dâobjet ne lâaffectent pas.
Donc ref: this prend actuellement le this courant de la fonction.
Nous pouvons réécrire la fonction et renvoyer le même this avec la valeur undefined :
function makeUser(){
return this; // cette fois il n'y a pas d'objet littéral
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
Comme vous pouvez le constater, le résultat de alert( makeUser().name ) est identique à celui de alert( user.ref.name ) de lâexemple précédent.
Voici le cas contraire :
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // John
Maintenant cela fonctionne parce que user.ref() est une méthode. Et la valeur de this est définie pour lâobjet avant le point ..
