Кратко
Геттер (get) — свойство, которое вычисляется при чтении. Сеттер (set) — свойство, которое выполняет логику при записи. Они позволяют контролировать доступ к данным.
Подробно
Геттер (get): const circle = { radius: 5, get area() { return Math.PI * this.radius ** 2; } };
console.log(circle.area); // 78.54 (без скобок!) // area — это свойство, не метод
Сеттер (set): const user = { _name: '', set name(value) { if (value.length < 2) { console.log('Имя слишком короткое'); return; } this._name = value; }, get name() { return this._name; } };
user.name = 'Анна'; // сеттер: проверка + присваивание console.log(user.name); // геттер: 'Анна' user.name = 'А'; // сеттер: 'Имя слишком короткое'
Зачем нужен:
- Валидация при записи
- Вычисляемые свойства
- Инкапсуляция (скрытие логики)
- Совместимость с API
Ментальная модель
Геттер — как автоматический калькулятор: спросили площадь — он сам считает. Сеттер — как охранник: хотите изменить данные — он проверяет, можно ли.
Примеры
**Самый простой:**
const temperature = {
celsius: 25,
get fahrenheit() {
return this.celsius * 9 / 5 + 32;
}
};
console.log(temperature.fahrenheit); // 77Геттер вычисляет fahrenheit из celsius.
**Простой:**
const account = {
_balance: 0,
set balance(amount) {
if (amount < 0) {
console.log('Баланс не может быть отрицательным');
return;
}
this._balance = amount;
},
get balance() {
return this._balance;
}
};
account.balance = 1000;
console.log(account.balance); // 1000
account.balance = -500; // 'Баланс не может быть отрицательным'Сеттер валидирует значение перед сохранением.
**Реальный пример:**
class Temperature {
constructor(celsius) {
this.celsius = celsius;
}
get fahrenheit() {
return this.celsius * 9 / 5 + 32;
}
set fahrenheit(f) {
this.celsius = (f - 32) * 5 / 9;
}
}
const temp = new Temperature(25);
console.log(temp.fahrenheit); // 77
temp.fahrenheit = 32;
console.log(temp.celsius); // 0Геттеры и сеттеры работают и в классах.
Частые ошибки
**Неправильно:** Вызывать геттер как метод: obj.area()
**Почему:** Геттер — это свойство, не метод. Без скобок: obj.area, не obj.area().
**Правильно:** obj.area — чтение через геттер.
**Неправильно:** Забывать, что сеттер не возвращает значение
**Почему:** Сеттер — это присваивание: obj.name = 'value'. Он не может вернуть результат.
**Правильно:** Для чтения используйте геттер.
**Неправильно:** Рекурсия в геттере
**Почему:** get area() { return this.area; } — бесконечная рекурсия!
**Правильно:** Используйте приватное поле: return this._area.
Важно запомнить
- get — свойство, вычисляется при чтении (без скобок!)
- set — выполняется при присваивании (obj.prop = value)
- Сеттер не возвращает значение
- Геттер не принимает аргументов
- Полезны для валидации и вычислений
Связь
Назад: Вы знаете методы объектов (JI4) — теперь у вас есть особый доступ к свойствам.
Вперёд: Следующий урок (JI8) — классы: синтаксический сахар над прототипами.