در جاوا اسکریپت پیش از این شیء گرایی نواقص بسیاری داشت که در ES6 تحولات مهمی در این زمینه پدید آمد.
در ES6 برای ایجاد کلاس از کلمه کلیدی class استفاده میشود. در پایین با یک مثال جامع قصد داریم یک کلاس کاربردی ایجاد کنیم:
class Hitos{
constructor(message){
this.message = message;
}
sum(x,y){
return this.message + ": " + (x + y);
}
}
let hitos = new Hitos("sum of two number");
console.log(hitos.sum(5,6));
همانطور که در مثال فوق میبینید در سطر اول با کلمه کلیدی class و نام Hitos یک کلاس ایجاد کردیم.
متد constructor که در هر کلاس میتواند وجود داشته باشد یک متد سازنده است. این متد سازنده کارکرد خاصی دارد که در آینده با آن آشنا میشویم. در مثال فوق متد سازنده یک مقدار دارد که در سطر بعد آن با کلمه کلیدی this سعی میکنیم یک متغیر با همان نام ایجاد کنیم و ورودی constructor را در آن قرار دهیم.
کلمه کلیدی this باعث میشود که این متغیر به این کلاس تعلق پیدا کند.
در سطر پنجم یک متد با نام sum ایجاد نمودیم که دو ورودی x و y میگیرد.
در سطر ششم و در return با this.message سعی میکنیم مقدار موجود در constructor را درج میکنیم. پس از استفاده از دو نقطه سعی میکنیم دو ورودی متد sum که x و y هستند را جمع کنیم.
در خارج بدنه کلاس با دستور new یک شی از روی کلاس Hitos ایجاد میکنیم و نام آن را hitos میگذاریم. ورودی این کلاس در واقع همان constructor است.
در سطر آخر با استفاده از متد sum که متعلق به کلاس Hitos است دو عدد 5 و 6 را جمع میکنیم. نتیجه خروجی به شرح زیر خواهد بود:
sum of two number: 11
Getterها و Setterها در کلاسهای جاوا اسکریپت 6
getterها و setterها نوعی متد هستند که در هنگام فراخوانی و در زمان دریافت نتایج صدا زده میشوند. مثال زیر را ببینید:
class Hitos{
constructor(message){
this.message = message;
}
get sum(){
return this.message + ": " + (this.A + this.B);
}
set sum(parameter){
this.A = parameter[0];
this.B = parameter[1];
}
}
let hitos = new Hitos("sum of two number");
hitos.sum = [5,6];
console.log(hitos.sum);
در سطر پنجم یک متد به نام sum با پیشوند get و در سطر هشت یک متد با همان نام و پیشوند set ایجاد نمودیم.
خارج کلاس ابتدا یک شی از کلاس Hitos با نام hitos ایجاد میکنیم و به آن یک ورودی میدهیم که به عنوان constructor تعیین میشود.
در سطر یکی مانده به آخر به متد sum شی hitos یک آرایه اختصاص میدهیم. در اینجا متد set sum فراخوانی میشود چون در حال درج مقدار هستیم.
در سطر آخر با دستور hitos.sum سعی میکنیم متد get sum را فراخوانی کنیم چون در این جا در حال واکشی اطلاعات هستیم.
نکته: متد setter تنها یک ورودی میتواند داشته باشد.
وراثت در کلاس ها
وراثت در کلاسها کاربرد فراوانی دارد که در این بخش قصد داریم به آن بپردازیم. در مثال زیر یک کلاس به نام Father و یک کلاس به نام Child ایجاد میکنیم. طبیعی است که فرزند یک نام منحصر به فرد برای خود دارد ولی فامیلی پدر را به ارث میبرد:
class Father{
constructor(last_name){
this.last_name = last_name;
}
lastName(){
return this.last_name;
}
}
class Child extends Father{
constructor(last_name, first_name){
super(last_name);
this.first_name = first_name;
}
}
let Ali = new Child("Alavi", "Ali");
console.log(Ali.lastName());
کلاس Father یک constructor دارد که ورودی آن یک فامیلی است و یک متد به نام lastName دارد که فامیلی را به خروجی میدهد.
کلاس Child با عبارت extends از کلاس Father ارث بری کرده است و در واقع این کلاس خود فرزندی از کلاس Father است.
کلاس Child نیز یک constructor دارد که یک فامیلی و یک نام را دریافت میکند. اگر دقت کنید first_name مانند قبل و به سادگی تعریف شد ولی برای تعریف last_name از دستور super بهره بردیم. دستور super باعث میشود این مقدار دهی به کلاس والد که کلاس Father است سپرده شود.
در خارج کلاسها و در سطر یکی مانده به آخر یک شیء به نام Ali از روی کلاس Child ایجاد میکنیم که ورودی اول آن فامیلی و ورودی دوم آن اسم است.
در سطر آخر با شی Ali سعی میکنیم متد lastName کلاس Father را صدا بزنیم. last_name کلاس والد توسط constructor کلاس فرزند مقدار دهی شد بنابراین بدلیل تبعیت کلاس Child از Father این کار به سادگی انجام شده و خروجی چاپ عبارت Alavi خواهد بود.
مثال زیر را با هم بررسی میکنیم:
class Father{
constructor(last_name){
this.last_name = last_name;
}
lastName(){
return this.last_name;
}
}
class Child extends Father{
constructor(last_name, first_name){
super(last_name);
this.first_name = first_name;
}
fullName(){
return this.first_name + " " + super.lastName();
}
}
let Ali = new Child("Alavi", "Ali");
console.log(Ali.fullName());
کلاس Father در مثال فوق مانند قبل است.
کلاس Child نیز مشابه مثال قبل است با این تفاوت که به آن متد fullName اضافه شده است. وظیفه این متد چاپ نام کامل شخص است. این متد مقدار فامیلی را از متد lastName کلاس Father دریافت میکند.
در خارج کلاسها و در خط یکی مانده به آخر یک شی به نام Ali از روی کلاس Child ایجاد کردیم.
در خط آخر متد fullName را از شی Ali فراخوانی کردیم که نتیجه چاپ عبارت "Ali Alavi" است.