Использование "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
, потому что makeUser()
вызвана как функция, не через «точку» как метод.
Литерал объекта сам по себе не влияет на this
. Значение this
одно для всей функции и блоков кода в ней, литеральные объекты не меняют его.
Таким образом, при создании объекта ref: this
берёт текущее значение this
функции makeUser()
.
А вот противоположный случай:
function makeUser() {
return {
name: "Джон",
ref() {
return this;
}
};
};
let user = makeUser();
alert( user.ref().name ); // Джон
Теперь это работает, поскольку user.ref()
вызывается как метод. И значением this
становится объект перед точкой .
.