آموزش ارثبری (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ها و ترکیب اشیاء به شما اجازه میدهد تا از قابلیتهای چندگانه بدون نیاز به ارثبری مستقیم بهرهمند شوید.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید