گام به گام با ES6 – کلاس
کلاس، یکی دیگر از ویژگیهای پرکاربرد ES6 است که کار برنامهنویسی را برای ما بسیار راحت کرد. قبلا برای تعریف کلاس دردسرهای زیادی داشتیم و خیلی وقتها درگیر شدن با prototypeها ما را از انجام اینکار منصرف میکرد. ولی با ES6، تعریف کلاس به راحتی هر زبان برنامهنویسی دیگری شده است. با صفرتاقهرمان همراه باشید تا با کلاس در جاوااسکریپت بیشتر آشنا شویم.
تعریف کلاس
برای تعریف کلاس، کلمهی کلیدی class را مینویسیم و به دنبال آن اسم کلاس و سپس آکولاد باز و بسته را تایپ میکنیم.
class Car { }
در مثال بالا به صورت خیلی ساده کلاسی به اسم Car ساختیم. این کار را به شکل دیگری هم میتوان انجام داد. از آنجا که تعریف کلاس بسیار شبیه تعریف function است به احتمال زیاد میتوانید روش دیگر تعریف کلاس را حدس بزنید. مثال زیر را نگاه کنید:
let Car = class { };
استفاده از کلاس
برای استفاده از کلاس باید یک شیء از روی آن ایجاد کنیم. برای این کار از کلمهی new استفاده میکنیم.
let car = new Car();
تعریف متد
برای تعریف متد در کلاس، کافیست اسم متد را به همراه پرانتزهایش و سپس آکولادها را بنویسیم؛ یعنی خبری از کلمهی function نیست. مثال زیر را ببینید:
class Car { start() { console.log('The car is ready ...'); } }
این متدها نیز مانند متدهایی که خارج از کلاس تعریف شدهاند میتوانند مقدار بازگشتی داشته باشند؛ به طور کلی تمام کارهایی که متدها قبلا در جاوااسکریپت انجام میدادند، در متدهای کلاس هم قابل انجام هستند. این متدها همچنین میتوانند به صورت static تعریف شوند. مثال زیر را ببینید:
class Car { start() { return 'Start'; } static info() { console.log('This is ... car'); } }
استفاده از متد
برای استفاده از متد، نام شیء را مینویسیم و بعد از آن نقطه(dot) میگذاریم و سپس اسم متد را به همراه پرانتز مینویسیم.
class Car { start() { return 'Start'; } static info() { console.log('This is ... car'); } } let c = new Car(); console.log(c.start());
برای استفاده از متدهای static هم نیاز به ساختن شیء نداریم و آنها را مستقیما از روی نام کلاس صدا میزنیم. مانند مثال زیر:
Car.info();
constructor
در جاوااسکریپت هم مانند زبانهای دیگر، هر کلاس متدی دارد که هنگام ساخته شدن شیء از روی آن کلاس فراخوانی میشود. به عبارت دیگر این تابع اولین تابعی است که هنگام استفاده از کلاس فراخوانی میشود و سازندهی آن کلاس به حساب میآید. در جاوااسکریپت برای ساختن متد سازنده، از کلمهی constructor استفاده میکنیم.
class Car { constructor() { console.log('Car object is ready to use.'); } } let c = new Car();
در حقیقت همان Car() که بعد از کلمهی new نوشتیم فراخوانی متد constructor را انجام میدهد.
تعریف متغیر
متغیرهای کلاس را نمیتوان بهصورت مستقیم در بدنهی کلاس تعریف کرد. برای اینکار در هر متدی که خواستیم از this.name استفاده میکنیم و به جای name اسم متغیر مورد نظر را مینویسیم؛ به اینصورت این متغیر در تمام کلاس قابل دسترس است. مثال زیر را ببینید:
class Car { constructor() { let year = 2017; this.model = 4; } }
در این مثال متغیری به اسم model داریم که به عنوان فیلد(متغیر) کلاس شناخته میشود و در تمام متدهای کلاس قابل دسترس است. متغیر دیگری هم به اسم year داریم که مثل همان متغیرهای عادی که قبلا در متدها استفاده میکردیم است.
*احتمالا در ورژنهای بعد EcmaScript قابلیت تعریف متغیر مستقیما در بدنهی کلاس را داشته باشیم.
استفاده از متغیر
برای استفاده از متغیرهای کلاس، کلمهی this و بعد از آن نقطه(dot) و سپس اسم متغیر را مینویسیم.
class Car { constructor() { let year = 2017; this.model = 4; } info() { console.log('model : ' + this.model); } } let c = new Car(); c.info();
در این مثال در متد info مقدار متغیر model را چاپ کردیم.
get و set
با استفاده از set میتوانید متغیرهای کلاس را مقداردهی کنید و با استفاده از get میتوانید مقدار آنها را بخوانید. البته اینکار را میتوان به صورت مستقیم و بدون استفاده از get و set هم انجام داد، ولی با استفاده از get و set میتوانیم روی ورودی و خروجی کنترل داشته باشیم.
class Car { constructor() { let year = 2017; this.model = 4; } info() { console.log('model : ' + this.model); } get Model() { return this.model; } set Model(model) { this.model = model; } } let c = new Car(); c.Model = 5; console.log(c.Model);
برای نوشتن get کافیست کلمهی get و به دنبال آن اسمی که میخواهیم متغیر ما به وسیلهی آن قابل دسترسی باشد را بیاوریم(معمولا این اسم را همان اسم متغیر با حرف اول بزرگ در نظر میگیرند) و در بدنهی آن(بین آکولاد باز و بسته) مقدار متغیر را return میکنیم.
برای نوشتن set همین کار را میکنیم، با این تفاوت که یک آرگومان به آن میدهیم و مقدار این آرگومان را در متغیر مورد نظر میریزیم.
وراثت
برای ارثبری یک کلاس از کلاس دیگر از کلمهی extends و به دنبال آن اسم کلاس والد استفاده میکنیم. مثال زیر را ببینید:
class Car { start() { console.log('Start'); } } class M4 extends Car { } let m = new M4(); m.start();
در مثال بالا کلاسی به اسم Car و کلاسی به اسم M4 که از Car ارثبری کرده است داریم. طبق روال ارثبری، متدهای موجود در کلاس Car در کلاس M4 نیز قابل دسترس هستند پس میتوانیم متد start از کلاس M4 را صدا بزنیم.
برای صدا زدن متد سازندهی کلاس والد میتوانیم از متد super استفاده کنیم. این متد فقط در سازندهی کلاس قابل دسترس است یعنی فقط در سازندهی کلاس M4 میتوانیم متد super را صدا بزنیم و با اینکار، سازندهی کلاس Car فراخوانده میشود.
class Car { constructor() { console.log('Car is ready'); } } class M4 extends Car { constructor() { super(); console.log('This is M4'); } } let m = new M4();
در رابطه با کلاسها شاید موارد زیادی باشد که در بقیه زبانهای برنامهنویسی دیده باشیم و انتظار حضور آنها در جاوااسکریپت را داشته باشیم؛ ولی اول از همه باید به این موضوع توجه کنیم که نوع استفاده از شیء در جاوااسکریپت با خیلی از زبانهای برنامهنویسی دیگر تفاوت دارد و قابلیتهایی که لازم است کلاسها داشته باشند با هم فرق میکند. دوم اینکه هنوز تا پخته شدن مفهوم کلاس در جاوااسکریپت فاصله داریم و قطعا در نسخههای آینده شاهد حضور ویژگیهای دیگری در این زبان خواهیم بود.
موفق باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.