Использование "this" в литерале объекта
Здесь функция makeUser
возвращает объект.
Каким будет результат при обращении к свойству объекта ref
? Почему?
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Каким будет результат?
Ответ: ошибка.
Проверьте:
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
Это потому, что правила, которые определяют значение this
, никак не смотрят на объявление объекта. Важен лишь момент вызова.
Здесь значение this
внутри makeUser()
равно undefined
, потому что оно вызывается как функция, а не через «точечный» синтаксис как метод.
Значение this
одно для всей функции, блоки кода и объектные литералы на него не влияют.
Таким образом, ref: this
фактически принимает текущее this
функции makeUser()
.
Мы можем переписать функцию и вернуть то же самое 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: "John",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // John
Теперь это работает, поскольку user.ref()
– это метод. И значением this
становится объект перед точкой .
.