Skip to content

Объекты и контекст `this`

Почему this зависит от того, как вызвали функцию.

also in web development basics

On this page

Метод – функция, записанная в свойстве объекта. Внутри метода this обычно указывает на объект, через который этот метод вызвали.

main.js
const car = {
  brand: "Volvo",
  model: "V60",
  year: 2022,
  getDescription() {
    return `${this.brand} ${this.model}, ${this.year} год`;
  },
};
 
console.log(car.getDescription());

Здесь метод вызван как car.getDescription(), поэтому this внутри него - объект car. Через this метод читает свойства именно этой машины.

Почему говорят «контекст вызова»

У обычной функции значение this зависит от способа вызова, а не только от места, где написан её код. Один и тот же метод можно вызвать от имени другого объекта:

main.js
const anotherCar = {
  brand: "Audi",
  model: "A4",
  year: 2024,
  getDescription: car.getDescription,
};
 
console.log(anotherCar.getDescription());
// Audi A4, 2024 год

Хотя функция метода была записана внутри объекта car, в новом вызове перед точкой стоит anotherCar. Поэтому this указывает на anotherCar, и результат содержит марку и модель Audi. Запоминайте правило так: для обычного метода важен объект слева от точки в момент вызова.

Стрелочная функция не создаёт собственный this, а берёт его из окружающего кода. Поэтому для метода объекта обычно используйте обычную запись getDescription() { ... }. Подробности: руководство MDN о this.