آموزش رایگان جاوا اسکریپت (JavaScript)

آموزش ارث‌بری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپ‌ها و کلاس‌ها

28م مهر 1403 محراب حسن زاده
آموزش ارث‌بری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپ‌ها و کلاس‌ها

ارث‌بری به معنای ایجاد یک کلاس جدید بر اساس یک کلاس موجود است، به طوری که کلاس جدید تمام خصوصیات و متدهای کلاس اصلی (پدر) را به ارث می‌برد. در جاوا اسکریپت، ارث‌بری اغلب با استفاده از توابع سازنده (Constructor Functions) و یا کلاس‌ها (Classes) انجام می‌شود.

جاوا اسکریپت از یک مدل شیءگرا بر پایه پروتوتایپ (Prototype-based) استفاده می‌کند که به شما اجازه می‌دهد تا شیء جدیدی ایجاد کنید که به یک شیء موجود (پروتوتایپ) متصل است. این مدل به شما امکان می‌دهد تا متدها و خصوصیات را بین اشیاء به اشتراک بگذارید.

 

ایجاد ارث‌بری با استفاده از پروتوتایپ‌ها

معرفی پروتوتایپ‌ها

پروتوتایپ‌ها در جاوا اسکریپت به عنوان قالب (Template) برای اشیاء عمل می‌کنند. هر شیء در جاوا اسکریپت یک پروتوتایپ دارد که می‌تواند متدها و خصوصیات را از آن به ارث ببرد.

 

ایجاد شیء با استفاده از پروتوتایپ

بیایید نگاهی به یک مثال ساده بیندازیم که در آن یک شیء Person ایجاد می‌کنیم و سپس یک شیء جدید با استفاده از پروتوتایپ آن ایجاد می‌کنیم.


function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};

const ali = new Person('Ali', 30);
ali.greet(); // Output: Hello, my name is Ali and I am 30 years old.

 

در این مثال، Person یک تابع سازنده است که دو خصوصیت name و age را تنظیم می‌کند. سپس، یک متد greet به پروتوتایپ Person اضافه می‌کنیم که پیامی را چاپ می‌کند. هنگامی که یک نمونه جدید از Person ایجاد می‌کنیم، این نمونه به متد greet دسترسی دارد.

 

ارث‌بری با استفاده از پروتوتایپ

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


function Student(name, age, grade) {
  Person.call(this, name, age); // فراخوانی سازنده Person
  this.grade = grade;
}

// تنظیم پروتوتایپ Student برای ارث‌بری از Person
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.study = function() {
  console.log(`${this.name} is studying in grade ${this.grade}.`);
};

const sara = new Student('Sara', 20, '12th');
sara.greet(); // Output: Hello, my name is Sara and I am 20 years old.
sara.study(); // Output: Sara is studying in grade 12th.

 

در این مثال:

  • تابع Student سازنده‌ی جدیدی است که به جز name و age یک خصوصیت grade نیز دارد.

  • با استفاده از Person.call(this, name, age) خصوصیات name و age را از Person به Student منتقل می‌کنیم.

  • پروتوتایپ Student را با Object.create(Person.prototype) به پروتوتایپ Person متصل می‌کنیم، که این باعث می‌شود Student از متدهای Person ارث ببرد.

  • متد constructor پروتوتایپ Student را به Student تنظیم می‌کنیم تا مرجع صحیحی به تابع سازنده آن باشد.

  • متد study را به Student.prototype اضافه می‌کنیم که تنها برای نمونه‌های Student در دسترس است.

 

استفاده از کلاس‌ها برای ارث‌بری

در ES6، کلاس‌ها (Classes) به جاوا اسکریپت معرفی شدند که کار با ارث‌بری و ایجاد اشیاء را ساده‌تر می‌کنند. بیایید همان مثال قبلی را با استفاده از کلاس‌ها بازنویسی کنیم.

 

عریف کلاس‌ها

ایجاد کلاس Person با استفاده از کلاس‌ها:


class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

const ali = new Person('Ali', 30);
ali.greet(); // Output: Hello, my name is Ali and I am 30 years old.

 

ارث‌بری با استفاده از کلاس‌ها

ایجاد کلاس Student که از Person ارث می‌برد:


class Student extends Person {
  constructor(name, age, grade) {
    super(name, age); // فراخوانی سازنده کلاس پدر (Person)
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying in grade ${this.grade}.`);
  }
}

const sara = new Student('Sara', 20, '12th');
sara.greet(); // Output: Hello, my name is Sara and I am 20 years old.
sara.study(); // Output: Sara is studying in grade 12th.

 

در این مثال:

  • کلمه کلیدی extends نشان می‌دهد که Student از Person ارث می‌برد.

  • کلمه کلیدی super برای فراخوانی سازنده کلاس پدر (Person) استفاده می‌شود و اجازه می‌دهد که name و age از طریق سازنده Person مقداردهی شوند.

  • Student همچنان متد study خود را دارد که فقط برای نمونه‌های Student تعریف شده است.

 

ارث‌بری چندگانه و ترکیب اشیاء

جاوا اسکریپت به طور مستقیم ارث‌بری چندگانه (Multiple Inheritance) را پشتیبانی نمی‌کند (جایی که یک کلاس می‌تواند از بیش از یک کلاس ارث ببرد). با این حال، می‌توان از ترکیب (Composition) و الگوهایی مانند Mixinها برای دستیابی به این مفهوم استفاده کرد.

 

Mixinها در جاوا اسکریپت

Mixin یک شیء یا کلاس است که شامل متدها و خصوصیات مشترک است که می‌توانند به چندین کلاس دیگر اضافه شوند.


const canEat = {
  eat() {
    console.log(`${this.name} is eating.`);
  }
};

const canWalk = {
  walk() {
    console.log(`${this.name} is walking.`);
  }
};

class Person {
  constructor(name) {
    this.name = name;
  }
}

// ادغام قابلیت‌ها با استفاده از Object.assign
Object.assign(Person.prototype, canEat, canWalk);

const ali = new Person('Ali');
ali.eat();  // Output: Ali is eating.
ali.walk(); // Output: Ali is walking.

 

نتیجه‌گیری

ارث‌بری در جاوا اسکریپت یک ابزار قدرتمند برای ایجاد کدهای قابل استفاده مجدد و قابل گسترش است. با استفاده از پروتوتایپ‌ها و کلاس‌ها، می‌توانید ساختارهای پیچیده‌ای ایجاد کنید که رفتار مشترکی را به اشتراک می‌گذارند. درک ارث‌بری و نحوه استفاده از آن به شما کمک می‌کند تا کدهای موثرتری بنویسید و از تکرار کد جلوگیری کنید. همچنین، استفاده از Mixinها و ترکیب اشیاء به شما اجازه می‌دهد تا از قابلیت‌های چندگانه بدون نیاز به ارث‌بری مستقیم بهره‌مند شوید.

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

مدیریت خطاها و استفاده از try...catch در جاوا اسکریپت: راهنمای کامل و مثال‌ها
28م مهر 1403

مدیریت خطاها و استفاده از try...catch در جاوا اسکریپت: راهنمای کامل و مثال‌ها

مطالعه بیشتر
آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها
10م شهریور 1402

آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها

مطالعه بیشتر
کار با تصاویر SVG در CSS: کنترل استایل و استفاده از گرافیک‌های مقیاس‌پذیر
16م آبان 1403

کار با تصاویر SVG در CSS: کنترل استایل و استفاده از گرافیک‌های مقیاس‌پذیر

مطالعه بیشتر
استفاده از visibility و opacity در CSS برای مخفی‌سازی عناصر: راهنمای کامل و کاربردی
11م آبان 1403

استفاده از visibility و opacity در CSS برای مخفی‌سازی عناصر: راهنمای کامل و کاربردی

مطالعه بیشتر
مقدمه‌ای به template و دیتابایندینگ در Vue.js: نحوه مدیریت داده‌ها و رندرینگ پویا
28م شهریور 1402

مقدمه‌ای به template و دیتابایندینگ در Vue.js: نحوه مدیریت داده‌ها و رندرینگ پویا

مطالعه بیشتر
Lifecycle Hooks در Vue.js | مدیریت چرخه حیات کامپوننت‌ها با مثال کاربردی
29م آذر 1404

Lifecycle Hooks در Vue.js | مدیریت چرخه حیات کامپوننت‌ها با مثال کاربردی

مطالعه بیشتر
راهنمای کامل تگ‌های متنی HTML و اصول سئو برای محتوا
18م مرداد 1402

راهنمای کامل تگ‌های متنی HTML و اصول سئو برای محتوا

مطالعه بیشتر
آموزش HTML: اولین گام برای طراحی سایت و سئو حرفه‌ای
18م مرداد 1402

آموزش HTML: اولین گام برای طراحی سایت و سئو حرفه‌ای

مطالعه بیشتر
راهنمای کامل لیست‌ها در HTML: آموزش انواع و اصول سئو
20م مرداد 1402

راهنمای کامل لیست‌ها در HTML: آموزش انواع و اصول سئو

مطالعه بیشتر
کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب
11م آبان 1403

کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب

مطالعه بیشتر
آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد
24م آذر 1404

آشنایی با Emit در Vue.js | انتقال رویدادها از کامپوننت فرزند به والد

مطالعه بیشتر
آموزش Event Handling و v-on در Vue.js | مدیریت رویدادها با مثال کاربردی
22م آذر 1404

آموزش Event Handling و v-on در Vue.js | مدیریت رویدادها با مثال کاربردی

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد