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
استفاده شود.