Qo'shimcha mavzular

Proxy va Reflect

Proxy boshqa obyektni "o'rab" oladi va u bilan bog'liq amallarni โ€” o'qish, yozish, o'chirish kabi โ€” ushlab qolib, o'zgartirish imkonini beradi. Reflect esa aynan shu amallarni past darajada bajarish uchun standart funksiyalar to'plamidir. Ular ko'pincha juft holda ishlatiladi.

Proxy sintaksisi

Proxy quyidagicha yaratiladi:

let proxy = new Proxy(target, handler);

Agar handler bo'sh bo'lsa, proxy targetga shaffof o'rab beradi โ€” barcha amallar to'g'ridan-to'g'ri asl obyektga o'tadi:

proxy-shaffof.js
// natija shu yerda chiqadi
Proxy shaffof ishlashi uchun asl obyekt bilan emas, faqat proxy bilan ishlash kerak. Proxy โ€” obyektning ustidagi "qatlam".

get tuzog'i: o'qishni ushlab qolish

Eng ko'p ishlatiladigan tuzoqlar โ€” get (xususiyat o'qishda) va set (xususiyat yozishda). get(target, property, receiver) chaqiriladi:

Mana mavjud bo'lmagan kalitlar uchun standart qiymat qaytaruvchi misol. Odatda mavjud bo'lmagan kalit undefined beradi, biz esa 0 qaytaramiz:

proxy-get-default.js
// natija shu yerda chiqadi

set tuzog'i: validatsiya

set(target, property, value, receiver) yozishni ushlab qoladi. U albatta qiymat qabul qilinganda true, rad etilganda false qaytarishi kerak. false qaytsa (yoki qat'iy rejimda) TypeError yuzaga keladi.

Massivga faqat butun son qo'shishga ruxsat beruvchi validatsiya:

proxy-set-validatsiya.js
// natija shu yerda chiqadi
Tuzoqlar amallarni shaffof ushlab qolishi kerak. setda return trueni unutmang โ€” aks holda amal muvaffaqiyatsiz deb hisoblanadi va xatolik chiqadi.

has va deleteProperty tuzoqlari

has(target, property) โ€” in operatorini ushlab qoladi. Quyida range obyekti oraliqqa tegishlilikni tekshiradi:

proxy-has.js
// natija shu yerda chiqadi

deleteProperty(target, property) โ€” deleteni ushlab qoladi. Masalan, _ bilan boshlangan "maxfiy" xususiyatlarni o'chirishni taqiqlaymiz:

proxy-delete.js
// natija shu yerda chiqadi

Reflect API

Reflect โ€” obyekt ustidagi ichki amallarni chaqirish uchun standart obyekt. Uning har bir metodi biror tuzoq bilan mos keladi: Reflect.get, Reflect.set, Reflect.has, Reflect.deleteProperty va hokazo.

Tuzoq ichida asl amalni bajarishning eng to'g'ri usuli โ€” mos Reflect metodini chaqirish. Bu receiverni to'g'ri uzatadi va meros (inheritance) holatlarida ham xatosiz ishlaydi:

reflect-get-set.js
// natija shu yerda chiqadi
Qoida: tuzoq ichida asl amalni target[prop] deb emas, Reflect.get(target, prop, receiver) deb bajaring. Bu receiver orqali thisni to'g'ri saqlaydi.

Cheklovlar

Proxy kuchli, lekin ba'zi cheklovlari bor:

Xulosa