js Reflect

در جاوااسکریپت، Reflect یک شیء سراسری (Global Object) است که شامل متدهایی برای دسترسی، ویرایش و کنترل رفتار اشیا است.
Reflect معمولاً همراه با Proxy استفاده می‌شود تا عملیات‌ها به‌صورت امن و استاندارد انجام شوند.

🔹 هدف از Reflect

قبل از ES6، بسیاری از کارهای مربوط به اشیا (مثل گرفتن یا تنظیم ویژگی‌ها) با توابع پراکنده انجام می‌شد.
Reflect این متدها را یک‌جا و با رفتار یکنواخت ارائه می‌دهد.

🔹 مثال ساده

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

console.log(Reflect.get(user, "name"));
Reflect.set(user, "age", 30);
console.log(Reflect.has(user, "age"));

📌 خروجی:

Ali
true

🔹 متدهای پرکاربرد Reflect

متد توضیح
Reflect.get(obj, prop) مقدار ویژگی را برمی‌گرداند.
Reflect.set(obj, prop, value) مقدار ویژگی را تنظیم می‌کند.
Reflect.has(obj, prop) بررسی می‌کند آیا ویژگی وجود دارد یا نه (مانند in).
Reflect.deleteProperty(obj, prop) ویژگی را حذف می‌کند.
Reflect.ownKeys(obj) همه کلیدهای شیء را (از جمله Symbolها) برمی‌گرداند.
Reflect.defineProperty(obj, prop, descriptor) ویژگی جدید با توضیحات خاص ایجاد می‌کند.
Reflect.getOwnPropertyDescriptor(obj, prop) اطلاعات ویژگی را برمی‌گرداند.
Reflect.preventExtensions(obj) از افزودن ویژگی جدید جلوگیری می‌کند.
Reflect.isExtensible(obj) بررسی می‌کند آیا شیء قابل گسترش است یا نه.


🔹 استفاده در Proxy

Reflect معمولاً داخل Proxy استفاده می‌شود تا رفتار اصلی شیء حفظ شود:

const user = { name: "Ali" };

const proxy = new Proxy(user, {
  get(target, prop) {
    console.log(`خواندن ویژگی: ${prop}`);
    return Reflect.get(target, prop);
  },
  set(target, prop, value) {
    console.log(`تغییر ویژگی: ${prop} = ${value}`);
    return Reflect.set(target, prop, value);
  }
});

proxy.name;
proxy.age = 25;

📌 خروجی:

خواندن ویژگی: name
تغییر ویژگی: age = 25

🔹 مقایسه با متدهای مستقیم

اگر مستقیماً از obj[prop] یا delete obj[prop] استفاده کنیم، ممکن است خطا یا رفتار ناخواسته رخ دهد.
Reflect متدهای امن‌تری ارائه می‌دهد که نتیجه را به‌صورت بولی (true یا false) برمی‌گردانند.

🔹 مثال: حذف ایمن ویژگی

const data = { secret: "1234" };

if (Reflect.deleteProperty(data, "secret")) {
  console.log("ویژگی حذف شد");
}

📌 خروجی:

ویژگی حذف شد

نکته:

  • Reflect برای جایگزینی متدهای پراکنده‌ی قدیمی ساخته شده است.

  • استفاده از آن باعث می‌شود کد تمیزتر، قابل‌پیش‌بینی‌تر و هماهنگ با Proxy باشد.

  • Reflect شیء سازنده نیست و نباید با new استفاده شود.