الدالة super()
جزء من قسم Object Oriented Programming في رحلة JavaScript على Coddy — الدرس 27 من 56.
تقوم الطريقة super() بإنشاء وتهيئة الكائن باستخدام منشئ الفئة الأب. ويجب استدعاؤها قبل أن تتمكن من إضافة أي خصائص إلى الفئة التابعة.
فكر في الأمر بهذه الطريقة: تقوم الفئة الأب ببناء أساس الكائن، و super() تقول "ابنِ ذلك الأساس أولاً" قبل أن تضيف الفئة الابنة ميزاتها الخاصة.
لنلقِ نظرة على المثال. أنشئ فئة أساسية (parent class):
class Employee {
constructor(name) {
this.name = name;
}
}الآن قم بإنشاء فئة تابعة (child class) ترث من الفئة الأساسية (parent):
class Manager extends Employee {
constructor(name, department) {
super(name); // استدعاء منشئ الفئة الأساسية مع الاسم
this.department = department;
}
}ما الذي يحدث هنا:
constructor(name, department)- يحتاج Manager إلى كل من name و departmentsuper(name)- يمررnameإلى constructor الخاص بـ Employee
this.department- يضبط الخاصية الفريدة للمدير (Manager)
يؤدي هذا إلى إنشاء مدير (Manager) يمتلك كلاً من الخصائص الموروثة (name) وخصائصه الخاصة (department)!
قم بإنشاء مثيل من الفئة الفرعية:
const myManager = new Manager("Sarah", "Engineering");
console.log(myManager.name); // "Sarah"
console.log(myManager.department); // "Engineering"يجب استدعاء الدالة super() قبل استخدام this في المُنشئ (constructor) لفئة مشتقة. إذا لم تقم باستدعاء super()، فستقوم JavaScript برمي خطأ مرجعي (reference error).
التحدي
بفرض وجود فئة Salad التي ترث من Meal. يجب أن تحتوي الـ Salad على كل من name و ingredients.
مهمتك هي إكمال مُنشئ (constructor) الفئة Salad من خلال:
- استدعاء
super()مع الخاصية name - تعيين الخاصية
ingredients
ورقة مرجعية
تقوم الطريقة super() بإنشاء وتهيئة الكائن باستخدام منشئ الفئة الأب (parent class). يجب استدعاؤها قبل أن تتمكن من إضافة أي خصائص إلى الفئة الابن (child class).
مثال على استخدام super() في فئة ابن:
class Employee {
constructor(name) {
this.name = name;
}
}
class Manager extends Employee {
constructor(name, department) {
super(name); // استدعاء منشئ الأب أولاً
this.department = department; // ثم إضافة خصائص الابن
}
}
const myManager = new Manager("Sarah", "Engineering");
console.log(myManager.name); // "Sarah"
console.log(myManager.department); // "Engineering"نقاط رئيسية:
- يجب استدعاء
super()قبل استخدامthisفي منشئ الابن - قم بتمرير الوسائط (arguments) اللازمة من الابن إلى منشئ الأب
- سيقوم JavaScript برمي خطأ مرجعي (reference error) إذا لم يتم استدعاء
super()
جرّب بنفسك
import { Meal } from './classes.js';
import { Salad } from './classes.js';
// كود الاختبار - لا تقم بالتعديل
const salad = new Salad("Caesar", ["lettuce", "croutons", "cheese"]);
console.log(salad.name); // يجب أن يطبع "Caesar"
console.log(salad.ingredients); // يجب أن يطبع ["lettuce", "croutons", "cheese"]يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1الكائنات والكلمة المفتاحية this
مراجعة سريعة: الكائناتإضافة Methods إلى الكائناتفهم الكلمة المفتاحية thisConstructor Functionsالكلمة المفتاحية newتحدي المراجعة7الوراثة والكلمة المفتاحية extends
الوراثةعلاقة "is-a"الكلمة المفتاحية extendsالدالة super()وراثة الخصائص والوظائفتحدي المراجعة2تنظيم الكود
ما هي الـ Modules؟التصدير باستخدام exportالاستيراد باستخدام importالـ Default مقابل الـ Named Exports8تنظيم كود OOP
تنظيم الـ Classes في Modules11مشروع: مصيّر الأشكال
إعداد: فئة Shape والتصديروراثة فئة Circle