JS Intermediate

Геттеры и сеттеры

Научиться создавать вычисляемые свойства (get) и контролируемое присваивание (set) в объектах.

Средний (Intermediate)
Нужно знать:Объекты

Кратко

Геттер (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

Ментальная модель

Геттер — как автоматический калькулятор: спросили площадь — он сам считает. Сеттер — как охранник: хотите изменить данные — он проверяет, можно ли.


Примеры

**Самый простой:**

javascript
const temperature = {
  celsius: 25,
  get fahrenheit() {
    return this.celsius * 9 / 5 + 32;
  }
};

console.log(temperature.fahrenheit); // 77

Геттер вычисляет fahrenheit из celsius.

**Простой:**

javascript
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; // 'Баланс не может быть отрицательным'

Сеттер валидирует значение перед сохранением.

**Реальный пример:**

javascript
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) — классы: синтаксический сахар над прототипами.

Материалы курса JS Intermediate — PROlab Academy.