Методы объекта, «this»
Объекты обычно создаются, чтобы представлять сущности реального мира:
// Объект пользователя
let user = {
name: 'Иван',
age: 24,
};
Так же, как и в реальном мире пользователь может совершать действия: выбирать что-то из корзины покупок, авторизовываться, оплачивать и т.д.
Такие действия в JavaScript представлены свойствами-функциями объекта (методы).
Пример метода
Добавляем метод sayHi
объекту user
:
let user = {
name: 'Иван',
age: 24,
sayHi() {
console.log('Привет!');
},
};
Ключевое слово «this» в методах
Как правило, методу объекта необходим доступ к информации, которая хранится в объекте, чтобы выполнить с ней какие-либо действия (в соответствии с назначением метода).
Например, коду внутри user.sayHi()
может понадобится имя пользователя, которое хранится в объекте user
.
Для доступа к информации внутри объекта метод может использовать ключевое слово
this
.
Значение this
— это объект «перед точкой», который использовался для вызова метода.
Например:
let user = {
name: 'Иван',
age: 24,
sayHi() {
// this — это «текущий объект»
console.log(this.name);
},
};
user.sayHi(); // -> Иван
Здесь во время выполнения кода user.sayHi()
значением this
будет являться user
(ссылка на объект user
).
Можно получить доступ к объекту и без ключевого слова this
, ссылаясь на него через внешнюю переменную user
(в
которой хранится объект).
Но такой код не будет надежным. Если мы скопируем ссылку на объект user
в другую переменную, например, admin = user
,
а затем перезапишем переменную user
чем-то другим, тогда будет осуществлен доступ к неправильному объекту при вызове
метода из admin
.
Это показано ниже:
let user = {
name: 'Иван',
age: 24,
sayHi() {
console.log(user.name); // приведет к ошибке
},
};
let admin = user;
user = null; // обнулим перменную, теперь она не хранит ссылку на объект
admin.sayHi(); // -> Ошибка!
// Внутри sayHi() используется переменная user, которая больше не ссылается на объект
«this» не является фиксированным
В JavaScript ключевое слово «this» может использоваться в любой функции.
Значение
this
вычисляется во время выполнения кода и зависит от контекста.
Например, здесь одна и та же функция назначена двум разным объектам и имеет различное значение this
при вызовах:
let user = {name: "Джо"};
let admin = {name: "Админ"};
function sayHi() {
console.log(this.name)
}
// используем одну и ту же функцию в двух объектах
user.f = sayHi;
admin.f = sayHi;
// «this» внутри функции является ссылкой на объект, который указан «перед точкой»
user.f(); // -> Джо (this == user)
admin.f(); // -> Админ (this == admin)
При вызове
obj.f()
значениеthis
внутриf
равноobj
.
У стрелочных функций нет «this»
У стрелочных функций нет своего собственного this
. Если мы используем this
внутри стрелочных функций, то его
значение берется из внешней «нормальной функции».
Например, здесь arrow()
использует значение this
из внешнего метода user.sayHi()
:
let user = {
name: 'Иван',
sayHi() {
let arrow = () => console.log(this.name);
arrow();
},
};
user.sayHi(); // -> Илья
Эта особенность стрелочных функций полезна, когда мы намерено хотим брать значение this
из внешнего контекста.
Итого
- Функции, которые находятся в объекте в качестве его свойств, называются «методами».
- Методы позволяют объектам выполнять действия:
obj.doSomething()
. - Методы могут ссылаться на объект через
this
. Значениеthis
вычисляется во время исполнения кода. - При объявлении функции, в ней можно использовать
this
, но этотthis
не имеет значения, до тех пор, пока функция не будет вызвана. - Когда функция вызывается синтаксисом «метода», значением
this
во время вызова будет объект перед точкой. - У стрелочных функций нет собственного
this
. Когда внутри стрелочной функции обращаются кthis
, то его значение берется снаружи.
Конспект статьи из учебника по JavaScript — Методы объекта, "this"