تخفیف ویژه

آموزش ویژگی های ECMAScript 6 (جلسه 45) : آموزش Reflect API - قسمت 4

دسته بندی: آموزش
زمان مطالعه: 4 دقیقه
۲۰ آبان ۱۳۹۶

همونطور که اطلاع دارید در جلسه قبل بحث مربوط به Reflect API رو پیش بردیم و توضیحات کاملی در مورد متدهای construct و isExtensible و preventExtension دادیم. در این جلسه میخوایم کار با Reflect API رو ادامه بدیم و تعدادی از متدهای دیگر اون رو با هم بررسی کنیم.

خب در اینجا میخوایم دیگر متدهای مربوط به بازتاب رو آموزش بدیم.

متد Reflect.defineProperty

با استفاده از این متد همانند متد Object.defineProperty میتونیم یک ویژگی جدید رو به شئ مورد نظر اضافه کنیم و یا یک ویژگی شئ رو تغییر بدیم. برای هر ویژگی میتونیم تنظیمات configurable و writable و enumerable رو مشخص کنیم. مقدار پیش فرض این مقادیر false هستند. مثلا فرض کنید که بخوایم یک ویژگی جدید رو به یک شئ اضافه کنیم، برای اینکار بصورت زیر عمل میکنیم:

let obj = {};

Reflect.defineProperty(obj, 'name', {
	value: 'Mohammad',
	configurable: true,
	writable: false,
	enumerable: true
});

میبینید که این متد نیز همانند متد Object.defineProperty سه ورودی رو دریافت میکنه:

  • شئ مورد نظر که میخوایم ویژگی به اون اضافه کنیم
  • نام مورد نظر برای ویژگی
  • یک شئ که درون اون تنظیمات رو مشخص میکنیم. میبینید که در بالا مقدار value یا مقدار برای ویژگی name رو برابر با Mohammad قرار دادیم.

همچنین میتونیم با استفاده از این متد یک ویژگی و تنظیمات مربوط به اون رو تغییر بدیم. بصورت زیر:

let obj = {
	name: 'Mohammad'
};

Reflect.defineProperty(obj, 'name', {
	value: 'Ali',
	configurable: true,
	writable: false,
	enumerable: true
});

میبینید که یک ویژگی برای شئ تعریف کردیم و با استفاده از defineProperty اون رو تغییر دادیم. تفاوتی که این متد با Object.defineProperty دارد بصورت زیر است:

  • در Object.defineProperty در صورت موفقیت، شئ برگشت داده میشه و در صورت شکست یک ارور نمایش داده میشه
  • در Reflect.defineProperty در صورت موفقیت، true و در غیر اینصورت false رو برگشت میده

همونطور که قبلا گفتیم بهتره از متدهای Reflect که در استاندارد جدید اومدن استفاده کنید. متدهای قدیمی و مشابه کم کم Deprecated و حذف خواهند شد.

متد Reflect.getOwnPropertyDescriptor

با استفاده از این متد همانند متد Object.getOwnPropertyDescriptor میتونین Descriptor یا شرح دهنده یکی از ویژگی‌های شئ مورد نظرتون رو بدست بیارید. یعنی تنظیماتی که با استفاده از متد بالا یعنی defineProperty انجام میدیم رو میتونیم با این متد بدست بیاریم. برای اینکار بصورت زیر عمل میکنیم:

let obj = {
	name: 'Mohammad'
};

console.log(Reflect.getOwnPropertyDescriptor(obj, 'name'));

میبینید که این متد دو ورودی رو دریافت میکنه. در ورودی اول نام شئ مورد نظر رو مشخص میکنید و در ورودی دوم نام ویژگی که میخواید Descriptor اون رو دریافت کنید، مشخص میکنید. خروجی بصورت زیر خواهد بود:

به همین راحتی. تفاوت این متد با متد مربوط به شئ Object:

  • اگر ورودی اول Reflect.getOwnPropertyDescriptor یک شئ نباشه، یک ارور نمایش داده میشه
  • اگر ورودی اول Object.getOwnPropertyDescriptor علاوه بر شئ، چیز دیگری هم باشه اول تبدیل صورت میگیره و بعد از اون توضیحات مربوط به ویژگی مورد نظر نمایش داده میشه. کد زیر رو در نظر بگیرید:
Reflect.getOwnPropertyDescriptor('foo', 0);
// TypeError: "foo" is not non-null object

Object.getOwnPropertyDescriptor('foo', 0);
// { value: "f", writable: false, enumerable: true, configurable: false }

میبینید که یک رشته رو وارد کردیم و بجای اینکه یک ارور رو ببینیم، اطلاعات مربوط به اولین کاراکتر این رشته رو دریافت کرده ایم.

متد Reflect.deleteProperty

با استفاده از این متد میتونین ویژگی‌های مورد نظرتون رو از شئ حذف کنید. این متد تقریبا همانند با عملگر قدیمی delete کار میکنه و بهتره که دیگه از delete استفاده نشود. در صورت موفقیت در پاک کردن ویژگی مورد نظر true و در غیر این صورت false برگشت داده میشه. این متد 2 ورودی رو دریافت میکنه:

  1. نام شئ مورد نظر
  2. نام ویژگی که قصد پاک کردن اون رو دارید

مثالهای زیر رو در نظر بگیرید:

var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, 'x'); // true
obj; // { y: 2 }

var arr = [1, 2, 3, 4, 5];
Reflect.deleteProperty(arr, '3'); // true
arr; // [1, 2, 3, , 5]

// Returns true if no such property exists
Reflect.deleteProperty({}, 'foo'); // true

// Returns false if a property is unconfigurable
Reflect.deleteProperty(Object.freeze({foo: 1}), 'foo'); // false

با اینکار به سادگی ویژگی مورد نظرمون رو حذف میکنیم.

متد Reflect.has

با استفاده از این متد میتونین وجود یا عدم وجود یک ویژگی در شئ مورد نظرتون رو بررسی کنید. این متد تقریبا همانند با عملگر in کار میکنه. در صورت وجود true و در صورت عدم وجود false برگشت داده میشه. این متد نیز دو ورودی رو دریافت میکنه. ورودی اول شئ مورد نظر و ورودی دوم ویژگی برای بررسی شدن. بصورت زیر:

Reflect.has({x: 0}, 'x'); // true
Reflect.has({x: 0}, 'y'); // false

به همین سادگی.

موفق و پیروز باشید.

یا علی

چه امتیازی به این مقاله می دید؟
نویسنده محمد اسفندیاری
بسیار به طراحی وب علاقمندم و به سرعت در حال یادگیری تمام مباحث پیشرفته هستم و دوست دارم که به دیگران هم یاد بدهم.

جلسات دوره

نظرات کاربران

مهرداد نادری

عالی بود خوب توضیح دادید

محمد اسفندیاری

موفق باشید دوست عزیز

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.