اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
چهار دقیقه
در زبانهای برنامهنویسی مانند سیشارپ و یا جاوا میتوانیم از Reflection جهت خواندن متادیتاها استفاده کنیم. به عنوان مثال امکان تعریف پراپرتی و یا متدها و حتی تایپهایی در زمان اجرا را در اختیارمان قرار میدهد. اما از آنجائیکه جاوا اسکریپت یک زبان داینامیک است، این قابلیت کمتر مورد توجه قرار گرفته است. در جاوا اسکریپت حین کار با کلاسها و اشیاء، ممکن است نیاز داشته باشید تا از اعضای یک کلاس
کوئری بگیرید و یا اینکه یک سری پراپرتی و متدهایی را در زمان اجرا به اشیاءتان اضافه کنید و یا مواردی از این دست.
تا قبل از ES 6 میتوانستیم به این صورت به اعضای یک کلاس دسترسی داشته باشیم:
var person = { name: 'Sirwan', family: 'Afifi', doWork: function () { //.... } }; for (var prop in person) { console.log(prop); }
for (var prop in person) { console.log(person[prop]); }
Reflect
همانطور که عنوان شد توسط API جدیدی با نام Reflect، میتوانیم به سادگی اعمال مربوط به Reflection را انجام دهیم. به عنوان مثال برای دسترسی به اعضای شیء person با استفاده از این API میتوانیم به این صورت عمل کنیم:
var person = { name: 'Sirwan', family: 'Afifi', doWork: function () { //.... } }; for (let prop of Reflect.enumerate(person)) { console.log(`the value for ${prop} is ${person[prop]}`); }
متدهای شیء Reflect
در ادامه تعدادی از متدهای شیء Reflect را مشاهده میکنید:
Reflect.get(target, name, [receiver]) Reflect.set(target, name, value, [receiver]) Reflect.has(target, name) Reflect.apply(target, receiver, args) Reflect.construct(target, args) Reflect.getOwnPropertyDescriptor(target, name) Reflect.defineProperty(target, name, desc) Reflect.getPrototypeOf(target) Reflect.setPrototypeOf(target, newProto) Reflect.deleteProperty(target, name) Reflect.enumerate(target) Reflect.preventExtensions(target) Reflect.isExtensible(target) Reflect.ownKeys(target)
var yay = Reflect.defineProperty(target, 'foo', { value: 'bar' }) if (yay) { // yay! } else { // oops. }
try { Object.defineProperty(target, 'foo', { value: 'bar' }) // yay! } catch (e) { // oops. }
var target = { foo: 'bar', baz: 'wat' } delete target.foo console.log(target) // <- { baz: 'wat' }
var target = { foo: 'bar', baz: 'wat' } let isDeleted = Reflect.deleteProperty(target, 'foo') console.log(isDeleted ); // true
برای مشاهدهی لیست کامل متدهای فوق میتوانید به اینجا مراجعه کنید. همچنین میتوان با مراجعه به قسمت Browser compatibility وضعیت پشتیبانی هر کدام را در مرورگرهای مختلف مشاهده کرد.
نکاتی که در حین کار کردن با Reflect باید در نظر بگیرید:
- این شیء فاقد متد [[Construct]] میباشد. یعنی نمیتواند همراه با کلمهی کلیدی new مورد استفاده قرار گیرد.
- همچنین نمیتوان آن را همانند یک تابع فراخوانی کرد.
- تمام متدهای آن به صورت استاتیک تعریف شدهاند (همانند شیء Math).