37- آموزش جاوااسکریپت | آموزش کلاسها (Classes) در ES6 جاوااسکریپت
در این آموزش با کلاسهای ES6 در جاوااسکریپت آشنا میشویم. کلاسها روشی مدرن، تمیز و استاندارد برای برنامهنویسی شیگرا هستند که کار با اشیاء را بسیار سادهتر کردهاند. یاد میگیریم که کلاسها در واقع همان ساختار پروتوتایپی قبلی هستند که با «سینتکس آسانتر» (Syntactic Sugar) بازنویسی شدهاند.
در روشهای قدیمی (ES5)، برای ساخت اشیاء از توابع سازنده (Constructor Functions) استفاده میکردیم. اگرچه آن روشها قدرتمند بودند، اما پیادهسازی وراثت و تعریف متدها کمی پیچیده بود. در ES6، کلاسها معرفی شدند تا این فرآیند را برای توسعهدهندگان (بهویژه کسانی که با زبانهایی مثل Java یا C# کار کردهاند) سادهتر و خواناتر کنند.
مهم است بدانید که کلاسهای ES6 در واقع تغییری در موتور جاوااسکریپت ایجاد نمیکنند؛ آنها همان وراثت پروتوتایپی را زیر لایه خود اجرا میکنند. به همین دلیل به آنها «سینتکس آسانتر» (Syntactic Sugar) میگویند؛ یعنی همان کار را انجام میدهند اما با ظاهری بسیار مرتبتر.
تعریف کلاس و Constructor
برای تعریف یک کلاس، از کلمه کلیدی class استفاده میکنیم. متد constructor بخشی است که هنگام ایجاد نمونه جدید از کلاس، برای مقداردهی اولیه ویژگیها فراخوانی میشود.
class Person {
constructor(firstName, lastName, dob) {
this.firstName = firstName;
this.lastName = lastName;
this.birthday = new Date(dob);
}
}
// ایجاد یک نمونه جدید از کلاس
const mary = new Person('Mary', 'Williams', '11-13-1980');
console.log(mary);
تعریف متدها در کلاس
در ES6 دیگر نیازی نیست به صورت دستی متدها را به prototype اضافه کنید. هر تابعی که داخل کلاس تعریف کنید، بهطور خودکار در پروتوتایپ شیء قرار میگیرد.
class Person {
constructor(firstName, lastName, dob) {
this.firstName = firstName;
this.lastName = lastName;
this.birthday = new Date(dob);
}
// متد برای خوشآمدگویی
greeting() {
return `Hello there ${this.firstName} ${this.lastName}`;
}
// متد برای محاسبه سن
calculateAge() {
const diff = Date.now() - this.birthday.getTime();
const ageDate = new Date(diff);
return Math.abs(ageDate.getUTCFullYear() - 1970);
}
// متد برای تغییر نام خانوادگی
getsMarried(newLastName) {
this.lastName = newLastName;
}
}
const mary = new Person('Mary', 'Williams', '11-13-1980');
mary.getsMarried('Thompson');
console.log(mary.greeting()); // Hello there Mary Thompson
console.log(mary.calculateAge()); // 45
متدهای Static
گاهی نیاز داریم متدهایی داشته باشیم که به یک نمونه خاص از کلاس (یک شیء ساخته شده) وابسته نباشند، بلکه به خودِ کلاس تعلق داشته باشند. به این نوع متدها، متد static میگوییم.
برای استفاده از متد استاتیک، نیازی به استفاده از new نیست و مستقیماً از طریق نام کلاس فراخوانی میشوند.
class Person {
// ... سایر کدهای کلاس
// متد استاتیک
static addNumbers(x, y) {
return x + y;
}
}
// فراخوانی متد استاتیک از طریق نام کلاس (نه نمونه شیء)
console.log(Person.addNumbers(1, 2)); // 3
نکته: اگر تلاش کنید متد استاتیک را روی نمونه ساخته شده (مثلاً mary.addNumbers) صدا بزنید، با خطا مواجه میشوید؛ زیرا این متدها بخشی از نمونه (Instance) نیستند.
جمعبندی
کلاسهای ES6 ابزاری عالی برای پیادهسازی ساختارهای شیگرا هستند. آنها کد شما را تمیزتر کرده و مدیریت متدها را به شدت تسهیل میکنند. در این بخش دیدیم که چگونه با استفاده از constructor شیء را تعریف کنیم، متدها را در کلاس بنویسیم و با متدهای static قابلیتهای عمومی برای کلاس خود ایجاد کنیم. در بخشهای بعدی، به سراغ مبحث مهم «ارثبری» (Inheritance) و نحوه توسعه کلاسها خواهیم رفت.