مقدمه

وراثت (Inheritance) یکی از اصول مهم برنامه‌نویسی شی‌گراست و به شما اجازه می‌دهد یک کلاس جدید بر پایه کلاس دیگر بسازید. با این ویژگی می‌توانید ویژگی‌ها و رفتارهای کلاس والد را بدون تکرار کد، به کلاس فرزند منتقل کنید و ساختار کد خود را توسعه‌پذیرتر کنید.

با وراثت، یک کلاس فرزند (Child) می‌تواند متدها و پراپرتی‌های کلاس والد (Parent) را به ارث ببرد و حتی در صورت نیاز، برخی متدها را بازنویسی (override) کند یا ویژگی‌های جدید به آن اضافه کند.

سینتکس extends و super

برای ایجاد وراثت در جاوااسکریپت از کلمه کلیدی extends استفاده می‌کنیم. اگر کلاس فرزند سازنده (constructor) خودش را داشته باشد باید با متد super() سازنده والد را فراخوانی کند.

در مثال زیر کلاس Student از Person ارث‌بری می‌کند و متد جدیدی نیز دارد.

Copy Icon JAVASCRIPT
class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log("Hello " + this.name);
  }
}
class Student extends Person {
  constructor(name, grade) {
    super(name);
    this.grade = grade;
  }
  showGrade() {
    console.log(this.name + " - " + this.grade);
  }
}
let st = new Student("lale", 18);
st.greet();       // Hello lale
st.showGrade();   //lale - 18

در اینجا کلاس Student با استفاده از extends از Person ارث‌بری می‌کند. متد greet از کلاس والد به صورت خودکار در Student قابل استفاده است و متد جدید showGrade نیز اضافه شده است. همچنین با استفاده از super(name) در سازنده Student، مقدار name به سازنده والد ارسال می‌شود.

بازنویسی متد والد

اگر در کلاس فرزند متدی با همان نام متد والد تعریف کنید، نسخه جدید جایگزین متد والد می‌شود. با کلمه super می‌توانید همچنان به متد والد دسترسی داشته باشید. مثال زیر را ببینید.

Copy Icon JAVASCRIPT
class Animal {
  speak() {
    console.log("animal sound");
  }
}

class Dog extends Animal {
  speak() {
    super.speak();
    console.log("bow-wow");
  }
}

let dog = new Dog();
dog.speak();

در اینجا متد speak در کلاس Dog بازنویسی شده است. ابتدا با استفاده از super.speak() متد والد اجرا می‌شود و سپس پیام جدید ("bow-wow") چاپ می‌گردد. بنابراین خروجی کد بالا به صورت زیر خواهد بود:

animal sound 
bow-wow

زنجیره وراثت و instanceof

در جاوااسکریپت می‌توانید چند سطح وراثت داشته باشید و کلاس‌های فرزند، خودشان هم والد شوند. با عملگر instanceof هم می‌توانید بررسی کنید یک شیء نمونه کدام کلاس است.

در مثال زیر کلاس Teacher از Person و SpecialTeacher از Teacher ارث‌بری می‌کند.

Copy Icon JAVASCRIPT
class Teacher extends Person {}
class SpecialTeacher extends Teacher {}
let t = new SpecialTeacher("Reza");
console.log(t instanceof SpecialTeacher); // true
console.log(t instanceof Teacher);        // true
console.log(t instanceof Person);         // true

در این مثال، شیء t که از کلاس SpecialTeacher ساخته شده است، همزمان نمونه‌ای از SpecialTeacher، Teacher و Person محسوب می‌شود. این به دلیل زنجیره وراثت است که باعث می‌شود ویژگی‌ها و متدهای کلاس‌های والد برای کلاس‌های فرزند نیز قابل دسترسی باشد.

وراثت کلاس‌ها ساختار کد شما را منظم‌تر، قابل نگهداری‌تر و توسعه‌پذیرتر می‌کند. با این قابلیت می‌توانید منطق مشترک را در کلاس‌های والد تعریف کنید و کلاس‌های فرزند را با ویژگی‌های جدید گسترش دهید. در درس بعدی در مورد یک مفهوم بسیار کلیدی دیگر در ارتباط با شی‌گرایی صحبت خواهیم کرد: متدها و پراپرتی‌های استاتیک.