Proxy: target, handler və tələlər

Proxy başqa obyektin (target) ətrafında sarğıdır. Əməliyyatlar (oxumaq, yazmaq, in, delete, çağırış) əvvəlcə handler-dəki uyğun funksiyaya, yəni tələyə düşür. Tələ yazılmayıbsa, əməliyyat target-ə birbaşa gedir.

javascript
const p = new Proxy(target, handler);
Proxy: kod, tələ və target
Proxy: kod, tələ və target

Tələ funksiyalarının ilk arqumenti həmişə target-dir. receiver Proxy-nin özüdür (və ya ondan miras alan obyekt).

💡 Reflect isə eyni əməliyyatların standart variantıdır: tələ içində “sadəcə normal işlə” demək üçün Reflect.get, Reflect.set kimi metodlar çağırılır.


get və set: susmaya görə dəyər və doğrulama

get hər oxunuşu tutur. Burada olmayan açar üçün mətn qaytarırıq (prop simvol ola bilər, ona görə String(prop)):

javascript
const defaults = { theme: 'light', lang: 'az' };

const settings = new Proxy(defaults, {
  get(target, prop, receiver) {
    if (prop in target) return Reflect.get(target, prop, receiver);
    return `no setting "${String(prop)}"`;
  },
});

console.log(settings.theme);
console.log(settings.fontSize);

set hər təyinatı tutur. Yanlış dəyərdə xəta atın, düzgündə Reflect.set nəticəsini qaytarın:

javascript
const user = new Proxy({}, {
  set(target, prop, value, receiver) {
    if (prop === 'age' && !Number.isInteger(value)) {
      throw new TypeError('age must be an integer');
    }
    return Reflect.set(target, prop, value, receiver);
  },
});

user.age = 30;
console.log(user.age);
try {
  user.age = 'old';
} catch (e) {
  console.log(`${e.name}: ${e.message}`);
}