Использовали ли вы геттеры в Node.js?

«Использовали ли вы геттеры в Node.js?» — вопрос из категории ООП, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использую геттеры в Node.js для вычисляемых свойств и инкапсуляции логики доступа к данным.

Основные сценарии использования:

  1. Вычисляемые свойства в классах:

    
    class Invoice {
    constructor(items) {
    this.items = items;
    }
    
    get total() {
    return this.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
    }
    
    get tax() {
    return this.total * 0.2; // 20% НДС
    }
    
    get totalWithTax() {
    return this.total + this.tax;
    }
    }

const invoice = new Invoice([ { name: 'Book', price: 10, quantity: 2 }, { name: 'Pen', price: 1, quantity: 5 } ]);

console.log(invoice.total); // 25 console.log(invoice.tax); // 5 console.log(invoice.totalWithTax); // 30


2. **Ленивые вычисления и кэширование:**
```javascript
class UserRepository {
  constructor() {
    this._users = null;
  }

  get users() {
    if (!this._users) {
      // Загружаем только при первом обращении
      this._users = this.loadUsersFromDatabase();
    }
    return this._users;
  }

  async loadUsersFromDatabase() {
    const db = await getDatabaseConnection();
    return db.collection('users').find().toArray();
  }
}
  1. Валидация и преобразование данных:

    class Product {
    constructor(rawData) {
    this.rawData = rawData;
    }
    
    get price() {
    const price = this.rawData.price;
    // Конвертируем центы в доллары
    return price / 100;
    }
    
    get formattedPrice() {
    return `$${this.price.toFixed(2)}`;
    }
    }
  2. Совместно с сеттерами для реактивности:

    class Observable {
    constructor() {
    this._value = 0;
    this.listeners = [];
    }
    
    get value() {
    return this._value;
    }
    
    set value(newValue) {
    const oldValue = this._value;
    this._value = newValue;
    this.listeners.forEach(fn => fn(newValue, oldValue));
    }
    }

В Node.js с ES6+ геттеры работают нативно, без необходимости в Object.defineProperty, что делает код чище и читаемее.