Reflection در جاوا اسکریپت


در برنامه نویسی کامپیوتر،reflection قابلیت و توانایی یک برنامه برای تغییر و دستکاری متغیرها،properties ها و متدهای اشیا در runtime است.
قبل از ES6، جاوا اسکریپت دارای ویژگی های reflection بود، حتی اگر به طور رسمی توسط community آن نام گذاری نشده باشد.به عنوان مثال، متدهایی مانند ()Object.keys()، Object.getOwnPropertyDescriptor و () Array.isArray ویژگی های reflection کلاسیک هستند.
ES6 یک global object جدید به نام Reflect را معرفی کرد که به شما این امکان را می دهد تا متدها را فراخوانی کنید، object بسازید، propertiesرا get و set کنید.
Reflect API به این دلیل مهم است که به شما این امکان را می دهد تا برنامه ها و فریمورک هایی را توسعه دهید که قادر به مدیریت کدهای پویا( dynamic code) هستند.
Reflect API
برخلاف اکثر global object ها،Reflect
یک constructor نیست.این بدان معناست که شما نمی توانید از Reflect با new
operator استفاده کنید یا Reflect را به عنوان یک تابع فراخوانی کنید.Reflect شبیه به Math و JSON است و تمام متدهای Reflect ثابت هستند.
- ()Reflect.apply – یک تابع را با argument های مشخص شده،فراخوانی می کند.
- ()Reflect.construct – مانند new operator اما به عنوان یک تابع عمل می کند که معادل فراخوانی new target(…args) است.
- ()Reflect.defineProperty – بسیار مشابه با ()Object.defineProperty است،اما یک مقدار Boolean برمیگرداند که نشان میدهد آیا property با موفقیت روی object تعریف شده است یا خیر.
- ()Reflect.deleteProperty – مشابه با
delete
operator اما به عنوان یک تابع عمل می کند که معادل فراخوانی delete objectName[propertyName] است. - ()Reflect.get – مقدار یک property را برمی گرداند.
- ()Reflect.getPrototypeOf – مشابه با ()Object.getPrototypeOf است.
- ()Reflect.has – مشابه با
in
operator اما به عنوان یک تابع عمل می کند.یک مقدار boolean بر اساس اینکه آیا property وجود دارد،برمی گرداند. - ()Reflect.ownKeys – آرایه ای از key های property (به ارث برده نشده) یک objecy را برمی گرداند.
- ()Reflect.preventExtensions – مشابه با ()Object.preventExtensions است.یک مقدار Boolean برمی گرداند.
- ()Reflect.set – یک مقدار را به یک property اختصاص می دهد و یک مقدارBoolean بر می گرداند که در صورت موفق بودن تخصیص مقدار true است.
در ادامه چند مثال از استفاده از Reflect API را کار می کنیم:
()Reflect.construct
متد ()Reflect.construct مانند new operator اما به عنوان یک تابع رفتار می کند .که معادل فراخوانی new target(…args) با امکان تعیین prototype متفاوت است:
1 |
Reflect.construct(target, args [, newTarget]) |
()Reflect.construct یک instance جدید از target یا newTarget در صورت مشخص شدن،که توسط target به عنوان constructor که با object args مقداردهی اولیه شده است،برمی گرداند.به مثال زیر توجه نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Person { constructor(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } get fullName() { return `${this.firstName} ${this.lastName}`; } }; let args = ['John', 'Doe']; let john = Reflect.construct( Person, args ); console.log(john instanceof Person); console.log(john.fullName); // John Doe |
خروجی:
1 2 |
true John Doe |
در این مثال :
- ابتدا یک کلاس به نام Person تعریف کنید.
- سپس یک آرایه به نام
args
با دو رشته تعریف کنید. - در سومین گام، یک instance جدید از کلاس Person با استفاده از متد ()Reflect.construct ایجاد کنید.john نمونه ای از کلاس Person است بنابراین دارای
fullName
property است.
فراخوانی یک تابع :()Reflect.apply
قبل از ES6، با استفاده از متد ()Function.prototype.apply، یک تابع را با this
value و arguments
های مشخص فراخوانی می کردیم. مثلا:
1 2 |
let result = Function.prototype.apply.call(Math.max, Math, [10, 20, 30]); console.log(result); |
خروجی:
1 |
30 |
()Reflect.apply همان ویژگی () Function.prototype.apply را با کد کمتر و درک آسان تر ارائه می دهد:
1 2 |
let result = Reflect.apply(Math.max, Math, [10, 20, 30]); console.log(result); |
قطعه کد زیر syntax مربوط به ()Reflect.apply را نشان می دهد:
1 |
Reflect.apply(target, thisArg, args) |
()Reflect.defineProperty
()Reflect.defineProperty مشابه با ()Object.defineProperty است.با این حال، یک Boolean برمیگرداند که نشان میدهد ، property با موفقیت تعریف شده است یا خیر:
1 |
Reflect.defineProperty(target, propertyName, propertyDescriptor) |
به مثال زیر دقت کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
let person = { name: 'John Doe' }; if (Reflect.defineProperty(person, 'age', { writable: true, configurable: true, enumerable: false, value: 25, })) { console.log(person.age); } else { console.log('Cannot define the age property on the person object.'); } |
مطالب زیر را حتما مطالعه کنید
Proxy در جاوا اسکریپت
()includes در جاوا اسکریپت
endsWith در جاوا اسکریپت
startsWith در جاوا اسکریپت
()Object.is در جاوا اسکریپت
()Object.assign در جاوا اسکریپت
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
https://reactapp.ir/courses/%d8%af%d9%88%d8%b1%d9%87-%d9%87%d8%a7%db%8c-%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d9%85%d9%82%d8%af%d9%85%d8%a7%d8%aa%db%8c-react-native/
salam link ha namayesh dadeh nemishan
سلام
اگر منظورتون لینک درس ها هست
ابتدا باید در دوره ثبت نام کنید
در انتهای ثبت نام لینک ها به شما نمایش داده می شود
همچنین از بخش حساب کاربری -> دانلودها میتونید تا همیشه به لینک های دانلود دوره هایی که ثبت نام کردید دسترسی داشته باشید