Використання "this" в об’єктному літералі
Тут функція makeUser повертає об’єкт.
Який результат доступу до його поля ref? Чому?
function makeUser() {
return {
name: "Іван",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Який результат?
Відповідь: помилка.
Спробуйте це:
function makeUser() {
return {
name: "Іван",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
Це тому, що правила, які встановлюють this, не розглядають оголошення об’єкта. Важливий лише момент виклику метода.
Тут значення this всередині makeUser() є undefined, оскільки воно викликається як функція, а не як метод із синтаксисом “через крапку”.
Значення this є одним для всієї функції, блоки коду та літерали об’єктів на це не впливають.
Отже, ref: this дійсно бере значення this функції.
Ми можемо переписати функцію і повернути те саме this зі значеннямundefined:
function makeUser(){
return this; // цього разу немає літерала об’єкта
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
Як бачите, результат alert( makeUser().name ) збігається з результатом alert( user.ref.name ) з попереднього прикладу.
Ось протилежний випадок:
function makeUser() {
return {
name: "Іван",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // Іван
Зараз це працює, оскільки user.ref() – це метод. І значення this встановлюється для об’єкта перед крапкою ..