js Proxy

در جاوااسکریپت، Proxy ابزاری قدرتمند است که برای کنترل و تغییر رفتار اشیا استفاده می‌شود.
با استفاده از Proxy می‌توان عملیات‌هایی مثل خواندن، نوشتن، حذف یا بررسی ویژگی‌های یک شیء را کنترل کرد.

🔹 ساخت یک Proxy ساده

Proxy با دو بخش ساخته می‌شود:

  1. شیء اصلی (target)

  2. شیء کنترل‌کننده (handler)

const user = { name: "Ali", age: 25 };

const proxy = new Proxy(user, {
  get(target, property) {
    return `ویژگی ${property}: ${target[property]}`;
  }
});

console.log(proxy.name);

📌 خروجی:

ویژگی name: Ali

در این مثال، وقتی proxy.name فراخوانی می‌شود، به‌جای مقدار مستقیم، خروجی سفارشی برمی‌گردد.

🔹 متدهای Trap در Proxy

Handler شامل توابعی به نام Trap است که رفتارهای مختلف شیء را کنترل می‌کنند، مثل:

Trap توضیح
get هنگام خواندن ویژگی فراخوانی می‌شود.
set هنگام تنظیم مقدار ویژگی فراخوانی می‌شود.
deleteProperty هنگام حذف ویژگی اجرا می‌شود.
has در زمان استفاده از in فراخوانی می‌شود.


🔹 مثال با Trap set

const person = {};

const proxy = new Proxy(person, {
  set(target, property, value) {
    if (property === "age" && value < 0) {
      console.log("سن نمی‌تواند منفی باشد!");
      return false;
    }
    target[property] = value;
    return true;
  }
});

proxy.age = -5;  // ❌ هشدار
proxy.age = 30;  // ✅ تنظیم موفق

📌 خروجی:

سن نمی‌تواند منفی باشد!

🔹 حذف ویژگی با کنترل

const data = { secret: "1234" };

const proxy = new Proxy(data, {
  deleteProperty(target, prop) {
    if (prop === "secret") {
      console.log("اجازه حذف ویژگی محرمانه را ندارید!");
      return false;
    }
    delete target[prop];
    return true;
  }
});

delete proxy.secret; // ❌ غیرمجاز

📌 خروجی:

اجازه حذف ویژگی محرمانه را ندارید!

🔹 کاربردهای متداول Proxy

  • اعتبارسنجی مقادیر قبل از ذخیره

  • جلوگیری از حذف یا ویرایش داده‌های خاص

  • ایجاد لاگ هنگام تغییر مقادیر

  • ساخت APIهای واکنشی (مثل Vue.js)

نکته:

  • Proxy فقط رفتار دسترسی به شیء را تغییر می‌دهد، نه ساختار آن.

  • برای حذف کنترل‌ها می‌توان از Reflect استفاده کرد.

  • از ES6 معرفی شده و در تمام مرورگرهای مدرن پشتیبانی می‌شود.