Что такое геттер (getter) в JavaScript/Node.js?

Ответ

Геттер (getter) — это специальный метод объекта или класса в JavaScript, который позволяет получить значение свойства, динамически вычисляя его при каждом обращении. Объявляется с помощью ключевого слова get.

Основные характеристики:

  • Вызывается как обычное свойство, без скобок ().
  • Не принимает параметров.
  • Позволяет инкапсулировать логику вычисления, сохраняя прозрачный интерфейс доступа.

Пример использования в объекте:

const user = {
  firstName: 'Anna',
  lastName: 'Smith',

  // Геттер для полного имени
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  },

  // Геттер может зависеть от других свойств
  get profileLink() {
    return `/users/${this.firstName.toLowerCase()}-${this.lastName.toLowerCase()}`;
  }
};

console.log(user.fullName); // 'Anna Smith'
console.log(user.profileLink); // '/users/anna-smith'

Пример в классе ES6 (актуально для Node.js):

class Product {
  constructor(price, taxRate) {
    this.price = price;
    this.taxRate = taxRate;
  }

  // Геттер для цены с налогом
  get priceWithTax() {
    return this.price * (1 + this.taxRate);
  }

  // Геттер для "ленивого" кэширования тяжелых вычислений
  get expensiveCalculation() {
    if (!this._cachedResult) {
      console.log('Performing heavy computation...');
      this._cachedResult = this.price * Math.PI; // Пример вычисления
    }
    return this._cachedResult;
  }
}

const item = new Product(100, 0.2);
console.log(item.priceWithTax); // 120
console.log(item.expensiveCalculation); // Выполнит вычисление
console.log(item.expensiveCalculation); // Вернёт закэшированное значение

Зачем это нужно в Node.js: Геттеры полезны для создания вычисляемых полей в моделях (например, в ORM типа Sequelize), реализации паттерна «ленивая загрузка», валидации данных перед возвратом и обеспечения обратной совместимости при рефакторинге внутренней структуры объекта.

Ответ 18+ 🔞

А, ну ты про геттеры спрашиваешь! Ёпта, штука-то на самом деле полезная, хоть и выглядит как какая-то мартышлюшка с синтаксисом.

Смотри, представь себе обычный объект, как будто это твой сосед Вася. У Васи есть firstName — Ваня, и lastName — Сидоров. И ты к нему постоянно пристаёшь: «Вась, а как тебя полностью-то звать?». А он тебе каждый раз: «Ваня Сидоров, блядь». Ну и заколебал ты его, конечно. Вот геттер — это как будто ты прикрутил Васе на лоб табличку «Полное имя», и теперь просто смотришь на неё, а он тебе сам в голове складывает «Ваня» + «Сидоров» и отдаёт результат. Тебе не надо каждый раз его спрашивать, он сам, блядь, сообразит.

const user = {
  firstName: 'Anna',
  lastName: 'Smith',

  // Вот это и есть геттер. Смотри, без скобок, как свойство.
  get fullName() {
    return `${this.firstName} ${this.lastName}`; // Берёт одно, берёт другое — склеивает.
  }
};

console.log(user.fullName); // 'Anna Smith' — видишь? Обратился, как к свойству, а оно вычислилось!

Теперь про классы в Node.js. Тут вообще красота. Допустим, у тебя есть товар. Цена есть, налог есть. И ты хочешь получить цену с налогом. Можно, конечно, каждый раз писать item.price * (1 + item.taxRate), но это же, ёб твою мать, неудобно! Терпения ноль ебать. А можно сделать геттер, и он будет как умная жопа, которая всегда знает актуальную сумму.

class Product {
  constructor(price, taxRate) {
    this.price = price;
    this.taxRate = taxRate;
  }

  // Вот он, красавец. Назвал как свойство, а работает как функция.
  get priceWithTax() {
    return this.price * (1 + this.taxRate); // Посчитал и отдал. Чисто, прозрачно.
  }
}

const item = new Product(100, 0.2);
console.log(item.priceWithTax); // 120 — и никаких тебе лишних телодвижений!

А ещё геттеры — это отличный способ для ленивых вычислений, или, как я это называю, «стратегия хитрой жопы». Допустим, у тебя есть тяжелое вычисление, которое делать на каждый чих — себе дороже. Ты можешь сделать геттер, который посчитает что-то сложное один раз, запомнит результат куда-нибудь в this._cache, и в следующий раз просто отдаст его. Удивление пиздец, как просто!

get expensiveCalculation() {
  if (!this._cachedResult) { // Если в кэше пусто...
    console.log('Performing heavy computation...'); // ...тогда, бля, пашем.
    this._cachedResult = this.price * Math.PI; // Считаем что-то долгое.
  }
  return this._cachedResult; // А если уже посчитано — на, хуй с горы, получай!
}

Зачем это всё в Node.js? Да овердохуища причин!

  1. Модели в БД (типа Sequelize). У тебя в базе first_name, last_name, а в коде хочется красивое user.fullName. Геттер — идеально.
  2. Ленивая загрузка. Не хочешь грузить тяжёлые данные или картинки, пока их не спросили? Геттер подгрузит их в момент обращения. Умно, как кот сука собака.
  3. Валидация на выходе. Прежде чем отдать какое-то внутреннее свойство, геттер может его проверить или почистить. Доверия ебать ноль ко внешнему миру, вот и фильтруй.
  4. Обратная совместимость. Решил ты поменять структуру объекта внутри, а наружу оставить старый интерфейс. Сделал геттер с новым названием — и все старые вызовы продолжают работать. Ни хуя себе, магия!

Короче, геттер — это не какая-то пиздопроебибная фича для умников. Это просто удобный способ сказать: «Эй, это свойство выглядит как простое, но на самом деле, чувак, тут мозги работают». Используй, не бойся. Главное — не начинай всё через геттеры делать, а то получится класс-бздун, который только и делает, что вычисляет что-то при каждом твоём чихе.