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

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

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

همونطور که اطلاع دارید در جلسه قبل کار با متد apply رو آموزش دادیم و در این جلسه میخوایم تعدادی از متدهای دیگر این شئ رو با هم بررسی کنیم.

نمونه سازی با استفاده از new

با استفاده از این متد میتونین یک نمونه جدید از سازنده یا Constructor مورد نظرتون رو به وجود بیارید. قبل از معرفی این متد، از عملگر new برای نمونه سازی استفاده می‌کردیم. تقریبا میشه گفت هر دو روش یک کار رو انجام می‌دهند ولی همونطور که در جلسه اول مربوط به Reflect بیان کردیم، هدف اصلی Reflect نظم و Semantic یا معناگرایی می‌باشد و کاربر با استفاده از اون میتونه کارهای بسیار جزئی رو انجام بدهد.

فرض کنید که یک کلاس بصورت زیر داشته باشیم:

class Car {
	constructor(name, price) {
		this.name = name;
		this.price = price;
	}

	getInfo() {
		return `The price for ${this.name} is ${this.price}$`;
	}
}

میبینید که یک کلاس بنام Car تعریف کرده و Constructor و متد getInfo رو برای اون قرار دادیم. حالا میتونیم با استفاده از new یک نمونه جدید از اون به وجود بیاریم:

let benz = new Car('Benz', 100000);

میبینید که کلاس مورد نظر رو با 2 آرگومان Benz و 100000 نمونه سازی کردیم و شئ ساخته شده رو در متغیر benz ذخیره کردیم. حالا میتونیم موارد زیر رو انجام بدیم:

console.log(benz instanceof Car);
console.log(benz);
console.log(benz.getInfo());

همونطور که میبینید در سه چیز مختلف رو در Console چاپ کردیم. در خط اول بررسی شده که benz نمونه ای از کلاس Car هست یا خیر. پاسخ true خواهد بود. در خط دوم شئ نمونه سازی شده رو چاپ کردیم. در خط آخر نیز متد getInfo مربوط به شئ benz رو فراخوانی کردیم. با اینکار خروجی بصورت زیر خواهد بود:

میبینید که همون چیزی که انتظار داشتیم به سادگی در Console چاپ شده است.

متد Reflect.construct

خب حالا میخوایم همین کار رو با استفاده از Reflect.construct نیز انجام بدیم.

متد construct سه ورودی رو دریافت میکنه:

  • کلاس یا تابعی که قراره فراخوانی بشه
  • آرایه ای از آرگومان ها
  • مشخص کردن new.target (اختیاری می‌باشد)

خب اگر بخوایم کد بالا رو با استفاده از متد Construct بنویسیم، بصورت زیر عمل میکنیم:

let benz = Reflect.construct(Car, ['Benz', 100000]);

میبینید که کلاس Car رو به عنوان ورودی اول و آرایه ای از آرگومانها رو به عنوان ورودی دوم قرار دادیم. خروجی همانند قبل خواهد بود. کل کدها بصورت زیر میشن:

class Car {
	constructor(name, price) {
		this.name = name;
		this.price = price;
	}

	getInfo() {
		return `The price for ${this.name} is ${this.price}$`;
	}
}

let benz = Reflect.construct(Car, ['Benz', 100000]);
console.log(benz instanceof Car);
console.log(benz);
console.log(benz.getInfo());

اگر کد بالا رو اجرا کنید، خروجی همانند گذشته میبینید.

ما در اینجا در مورد متد سوم که اختیاری بود خیلی توضیح نمیدیم و خودتون میتونین اون رو مطالعه کنید. برای مطالعه میتونین این لینک و این لینک رو ببینید.

متد Reflect.isExtensible

با استفاده از این متد میتونین بررسی کنید که یک شئ Extensible یا توسعه پذیر هست یا خیر. در صورت Extensible بودن true و در غیر اینصورت false برگشت داده می‌شود. زمانی به یک شئ Extensible گفته میشه که بتونیم آزادانه ویژگی‌های جدیدی رو به اون اضافه کنیم. بعضی اوقات به دلایلی پیش میاد که جلوی Extensible بودن یک شئ رو بگیریم تا اون شئ بصورت عمدی یا سهوی چیزی بهش اضافه نشود.

قبل از این متد از Object.isExtensible استفاده میشد که خیلی شبیه به هم هستند و یک تفاوت اندک در اونا وجود دارد. متد Object.isExtensible هر چیزی رو که بخواید بررسی میکنه و در صورت توسعه پذیر نبودن false رو برمی گردونه. اما اگر یک مقدار غیر شئ رو با Reflect.isExtensible بررسی کنید، یک ارور نمایش داده میشه.

var empty = {};
Reflect.isExtensible(empty); // === true 


// Sealed objects are by definition non-extensible. 
var sealed = Object.seal({}); 
Reflect.isExtensible(sealed); // === false 

// Frozen objects are also by definition non-extensible. 
var frozen = Object.freeze({}); 
Reflect.isExtensible(frozen); // === false

میبینید که در خط اول یک شئ خالی بنام empty ایجاد کردیم و در خط دوم توسعه پذیر بودن اون رو تست کردیم. هر شئ بصورت پیش فرض توسعه پذیر هست و به همین خاطر نتیجه true خواهد بود.

قبل از سر کار اومدن ES6 با استفاده از دو متد Object.seal و Object.freeze میتونستیم جلوی توسعه پذیر بودن یک شئ رو بگیریم. همونطور که در بالا میبینید، بعد از استفاده از دو متد، مجددا توسعه پذیری رو چک کردیم و این بار خروجی false می‌باشد.

متد Reflect.preventExtension

با استفاده از این متد میتونین همانند متدهای بالا و متد Object.preventExtension، مانع توسعه پذیر بودن یک شئ رو بگیرید. برای اینکار بصورت زیر عمل میکنیم:

let empty = {};
Reflect.isExtensible(empty); // true

Reflect.preventExtensions(empty);
Reflect.isExtensible(empty); // false

همونطور که میبینید قبل از استفاده از این متد، خروجی true و بعد از استفاده از اون خروجی false خواهد شد. هر چیزی غیر از شئ رو به این متد ارسال کنید، یک ارور دریافت خواهید کرد.

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

یا علی

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

جلسات دوره

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

اولین دیدگاه این پست رو تو بنویس !

نیاز به لاگین

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