Методы и this
До сих пор строки анкеты хранили данные: имя, возраст, город. Представьте строку, в которой записано не значение, а поручение: «поздоровайся, назвав имя из этой анкеты». Поручение выполняют, а имя берут из той анкеты, в которой оно записано.
Значением свойства может быть что угодно, в том числе функция. Тогда объект хранит не только данные, но и действие над ними:
const user = {
name: "Ann",
greet: function () {
return `Hi, ${this.name}`;
}
};
console.log(user.greet()); // Hi, AnnДавайте разберём пример:
- Свойство
greetхранит функцию, записанную после двоеточия. - Внутри функции
this.nameчитает имя из того объекта, у которого функцию вызвали. - Вызов
user.greet()возвращает строкуHi, Ann, иconsole.logеё печатает.
Метод и this
Свойство, в котором лежит функция, называют методом. Метод вызывают через точку: user.greet(). Скобки обязательны: user.greet без них — сама функция, и console.log(user.greet) печатает [Function: greet].
Так же устроены уже знакомые методы строк и массивов: "abc".toUpperCase() и nums.push(3) — функции, вызванные через точку.
Внутри метода слово this обозначает объект, стоящий перед точкой в вызове. При вызове user.greet() это user, поэтому this.name читает его свойство name.
Одна функция в двух объектах
Одну и ту же функцию можно положить в два объекта. Каждый вызов через точку получит в this свой объект — тот, что стоит перед точкой:
function describe() {
return `${this.name} is ${this.age}`;
}
const ann = { name: "Ann", age: 30, describe: describe };
const bob = { name: "Bob", age: 25, describe: describe };
console.log(ann.describe()); // Ann is 30
console.log(bob.describe()); // Bob is 25Давайте посмотрим, что попадает в this в каждом вызове:
describeобъявлена как обычная функция и записана в оба объекта под ключомdescribe.- При вызове
ann.describe()перед точкой стоитann, и функция возвращаетAnn is 30. - При вызове
bob.describe()перед точкой стоитbob, и та же функция возвращаетBob is 25.
Здесь аналогия с поручением перестаёт работать. Функция describe не принадлежит ни одной анкете: это одно поручение, подшитое сразу к двум. Какой объект окажется в this, решает не место, где функция записана, а вызов — объект перед точкой.
На собеседовании часто спрашивают, чему равен this. Для вызова через точку ответ один: объекту, который стоит перед точкой.
Метод меняет объект
Через this метод может не только читать свойства, но и менять их. Так устроен счётчик: он хранит число и умеет его увеличивать.
const counter = {
count: 0,
increment: function () {
this.count++;
}
};
counter.increment();
counter.increment();
console.log(counter.count); // 2Разберём по шагам:
- Объект
counterхранит число в свойствеcountи функцию в свойствеincrement. - Каждый вызов
counter.increment()кладёт вthisобъектcounter, иthis.count++увеличивает его свойство на единицу. - После двух вызовов свойство равно
2, и программа печатает2.
Метод меняет тот самый объект, у которого его вызвали, а не его копию. Поручение в анкете исправляет строку той же анкеты.
Частая ошибка
Внутри метода к свойству обратились без this:
const counter = {
count: 0,
increment: function () {
count++; // ✗
}
};
counter.increment();ReferenceError: count is not definedСвойство count — не переменная: внутри метода оно не видно по одному имени. JavaScript ищет переменную count, не находит её и останавливает программу.
Ошибка появляется только при вызове: пока increment не вызван, программа работает. Метод читает и меняет свойство своего объекта через this: this.count++.
Главное
- Метод — свойство, в котором лежит функция; его вызывают через точку со скобками:
user.greet(). - В вызове через точку
this— объект, который стоит перед точкой. - Одна функция в двух объектах получает в
thisтот объект, у которого её вызвали. - Свойство своего объекта метод читает и меняет через
this, а не по одному имени.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.