38- آموزش جاوااسکریپت | ارثبری (Inheritance) و Subclassing در کلاسهای ES6
در این آموزش، با نحوه پیادهسازی وراثت در کلاسهای مدرن ES6 جاوااسکریپت آشنا میشویم. یاد میگیریم چگونه با استفاده از کلمات کلیدی `extends` و `super`، یک کلاس والد (Parent Class) را گسترش دهیم و کلاسهای فرزند (Subclasses) بسازیم که ویژگیها و متدهای کلاس والد را به ارث میبرند.
در بخشهای قبلی با کلاسهای ES6 و نحوه تعریف سازنده (Constructor) و متدها آشنا شدیم. یکی از قدرتمندترین قابلیتهای برنامهنویسی شیگرا، ارثبری (Inheritance) است. در ES6، این مفهوم با نام Subclassing شناخته میشود و به ما اجازه میدهد کلاسی بسازیم که قابلیتهای کلاس دیگری را گسترش میدهد.
تعریف کلاس والد (Parent Class)
ابتدا یک کلاس پایه به نام Person تعریف میکنیم که نام، نام خانوادگی و یک متد برای خوشآمدگویی دارد.
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
greeting() {
return `Hello there ${this.firstName} ${this.lastName}`;
}
}
ایجاد کلاس فرزند (Subclass) با extends
برای اینکه کلاسی ایجاد کنیم که از Person ارثبری کند، از کلمه کلیدی extends استفاده میکنیم. در اینجا کلاس Customer را به عنوان فرزند Person تعریف میکنیم.
استفاده از super()
زمانی که در کلاس فرزند (Subclass) یک constructor تعریف میکنیم، باید حتماً متد super() را فراخوانی کنیم. super در واقع سازنده کلاس والد را اجرا میکند و ویژگیهایی را که از والد به ارث میرسد (مانند firstName و lastName) مقداردهی میکند.
class Customer extends Person {
constructor(firstName, lastName, phone, membership) {
// فراخوانی سازنده کلاس والد
super(firstName, lastName);
// تعریف ویژگیهای اختصاصی کلاس فرزند
this.phone = phone;
this.membership = membership;
}
}
نمونهسازی و استفاده از متدهای ارثبری شده
اکنون میتوانیم یک نمونه از Customer بسازیم. با وجود اینکه متد greeting را داخل Customer تعریف نکردیم، اما به دلیل ارثبری، این متد برای نمونههای Customer در دسترس است.
const john = new Customer('John', 'Doe', '555-5555', 'Standard');
console.log(john);
// خروجی: Customer { firstName: 'John', lastName: 'Doe', phone: '555-5555', membership: 'Standard' }
console.log(john.greeting());
// خروجی: Hello there John Doe
متدهای Static در کلاسهای فرزند
علاوه بر متدهای معمولی، میتوانیم متدهای static را نیز در کلاس فرزند تعریف کنیم که فقط از طریق نام کلاس قابل دسترسی هستند.
class Customer extends Person {
constructor(firstName, lastName, phone, membership) {
super(firstName, lastName);
this.phone = phone;
this.membership = membership;
}
static getMembershipCost() {
return 500;
}
}
// فراخوانی متد استاتیک
console.log(Customer.getMembershipCost()); // 500
نکته مهم: ارثبری یکطرفه است. یعنی کلاس فرزند (Customer) به متدهای کلاس والد (Person) دسترسی دارد، اما کلاس والد هیچ اطلاعی از کلاس فرزند ندارد و نمیتواند از متدهای آن استفاده کند. بنابراین اجرای Person.getMembershipCost() منجر به خطا خواهد شد.
جمعبندی
استفاده از extends برای گسترش کلاسها و super() برای فراخوانی سازنده والد، روشی استاندارد و تمیز برای مدیریت سلسلهمراتب کلاسها در جاوااسکریپت است. این ساختار به شما اجازه میدهد کدهایی قابل استفاده مجدد (Reusable) و ساختاریافته بنویسید.