darsga qaytish

Kuzatiluvchilar

Proksi-serverni qaytarish orqali “ob’ektni kuzatilishi mumkin bo’lgan” “makeObservable(target)” funksiyasini yarating.

Bu qanday ishlashi kerak:

function makeObservable(target) {
  /* sizning kodingiz */
}

let user = {};
user = makeObservable(user);

user.observe((key, value) => {
  alert(`SET ${key}=${value}`);
});

user.name = "John"; // alerts: SET name=John

Boshqacha qilib aytadigan bo’lsak, makeObservable tomonidan qaytarilgan ob’ekt xuddi asl ob’ektga o’xshaydi, lekin har qanday xususiyat o’zgarishida “ishlovchi” funksiyasini o’rnatuvchi observe(handler) usuliga ega.

Xususiyat o’zgarganda, handler(kalit, qiymat) xususiyat nomi va qiymati bilan chaqiriladi.

P.S. Ushbu vazifada, iltimos, faqat xotiraga yozish haqida ehtiyot bo’ling. Boshqa operatsiyalar ham xuddi shunday tarzda amalga oshirilishi mumkin.

Yechim ikki qismdan iborat:

  1. Qachonki .observe(handler) chaqirilsa, keyinroq qo’ng’iroq qilishimiz uchun ishlov beruvchini biror joyda eslab qolishimiz kerak. Biz ishlovchilarni to’g’ridan-to’g’ri ob’ektda saqlashimiz mumkin, bunda o’z belgimizdan mulk kaliti sifatida foydalanamiz.
  2. Har qanday o’zgarish bo’lsa, ishlov beruvchilarga qo’ng’iroq qilish uchun bizga set trapli proksi-server kerak.
let handlers = Symbol("handlers");

function makeObservable(target) {
  // 1. Qiymatlarni yaratish
  target[handlers] = [];

  // Kelgusi qo'ng'iroqlar uchun ishlov beruvchi funksiyasini massivda saqlang
  target.observe = function (handler) {
    this[handlers].push(handler);
  };

  // 2. O'zgarishlarni boshqarish uchun proksi-server yarating
  return new Proxy(target, {
    set(target, property, value, receiver) {
      let success = Reflect.set(...arguments); // operatsiyani ob'ektga yo'naltirish
      if (success) {
        // mulkni o'rnatishda xatolik bo'lmasa
        // barcha ishlovchilarni chaqiring
        target[handlers].forEach((handler) => handler(property, value));
      }
      return success;
    },
  });
}

let user = {};

user = makeObservable(user);

user.observe((key, value) => {
  alert(`SET ${key}=${value}`);
});

user.name = "John";