Ответ
Да, активно использую геттеры в Node.js для вычисляемых свойств и инкапсуляции логики доступа к данным.
Основные сценарии использования:
-
Вычисляемые свойства в классах:
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();
}
}
-
Валидация и преобразование данных:
class Product { constructor(rawData) { this.rawData = rawData; } get price() { const price = this.rawData.price; // Конвертируем центы в доллары return price / 100; } get formattedPrice() { return `$${this.price.toFixed(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, что делает код чище и читаемее.