Skip to content

Proxy pattern

Proxy Pattern — bu structural design pattern bo‘lib, u boshqa bir target object bilan o‘zaro ishlashni nazorat qilish uchun proxy yaratadi. JavaScriptda bu pattern uchun, Proxy API ni ishlatsak bo’ladi.

Proxy orqali biz object bilan bo‘layotgan har bir interaction ni (masalan, property ni o‘qish, yozish, method chaqirish) ushlab qolishimiz va o‘zimiz xohlagan behavior ni qo‘shishimiz mumkin.

Proxy Pattern quyidagi holatlarda juda foydali:

  • Access control — object ga kirishni cheklash
  • Validation — object ga berilayotgan qiymatlarni tekshirish
  • Logging — qaysi property o‘qildi yoki o‘zgartirildi
  • Lazy initialization — object ni faqat kerak bo‘lganda yaratish
  • Caching — qayta-qayta hisoblanadigan qiymatlarni saqlash

JavaScriptda Proxy global constructor bo‘lib, u ikki argument qabul qiladi:

const proxy = new Proxy(target, handler);
  • target — asl object
  • handler — (interception logic) bu ma’lum bir operationni ushlab qoluvchi function (masalan get, set).

Quyidagi misolda biz proxy orqali, object dan property o’qish jarayoniga o’zimizning logikamizi qo’shamiz:

const user = {
name: "Alp Er To'nga",
age: 25,
};
const userProxy = new Proxy(user, {
get(target, property) {
console.log(`Accessing property: ${property}`);
return target[property];
},
});
console.log(userProxy.name);
// Accessing property: name
// Alp Er To'nga

Yuqoridagi misolda objectning get qilish jarayoniga o’zimizning funksiyamizi qo’shgan bo’lsak, quyida set qilish jarayoniga validation qo’shib ko’ramiz:

const userProxy = new Proxy(user, {
set(target, property, value) {
if (property === "age" && value < 0) {
throw new Error("Age cannot be negative");
}
target[property] = value;
return true;
},
});
userProxy.age = 30; // OK
userProxy.age = -5; // Error

Access control (himoyalangan property)

const user = {
username: "admin",
password: "secret",
};
const secureUser = new Proxy(user, {
get(target, property) {
if (property === "password") {
throw new Error("Access denied");
}
return target[property];
},
});
console.log(secureUser.username);
console.log(secureUser.password); // Error - Access denied