خطای "Super Not Called" در جاوااسکریپت

javascript super not called error
24 اردیبهشت 1404

فهم خطای "Super Not Called" در جاوااسکریپت


سلام! امروز می‌خواهیم درباره‌ی خطای "Super not called" در جاوااسکریپت صحبت کنیم. این خطا زمانی به وجود می‌آید که شما از کلاس‌ها استفاده می‌کنید و فراموش می‌کنید تابع سازنده‌ی والد را فراخوانی کنید. شاید بپرسید چرا این موضوع مهم است؟ علت این است که در معماری شی‌گرا، ما از وراثت برای استفاده از خصوصیات و متدهای کلاس والد در کلاس فرزند استفاده می‌کنیم، و اگر از super() استفاده نکنیم، این خصوصیات نداریم!


به طور کلی، زمانی که شما یک کلاس جدید تعریف می‌کنید و می‌خواهید آن را از یک کلاس دیگر به ارث ببرید، باید حتماً از دستور super() در سازنده‌ی خود استفاده کنید. در غیر این صورت، جاوااسکریپت نمی‌تواند بفهمد که باید چه مقادیری را از کلاس والد بگیرد و خطای "Super not called" را به شما نشان می‌دهد. این مشکل معمولاً در کلاس‌هایی که با استفاده از ES6 تعریف شده‌اند، بیشتر دیده می‌شود.


حل این مشکل خیلی ساده است! فقط کافی است که کافی است در آغاز سازنده‌ی کلاس فرزند خود از super() استفاده کنید. این کار باعث می‌شود که سازنده‌ی والد قبل از هر چیزی اجرا شود و تمام خصوصیات و متدهای لازم در دسترس شما قرار بگیرد. بنابراین وقتی که تصمیم دارید کلاسی جدید بسازید، مراقب باشید که این نکته را فراموش نکنید.


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


class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}

class Dog extends Animal {
constructor(name) {
super(name);
}
speak() {
console.log(`${this.name} barks.`);
}
}

const dog = new Dog('Rex');
dog.speak(); // Output: Rex barks.

توضیح کد



line 1: class Animal {
این خط یک کلاس جدید به نام Animal تعریف می‌کند.

line 2: constructor(name) {
این خط سازنده‌ی کلاس را تعریف می‌کند که نام حیوان را به عنوان پارامتر می‌گیرد.

line 3: this.name = name;
در این خط، مقدار نام به خصوصیت name نسبت داده می‌شود.

line 4: speak() {
این خط یک متد به نام speak را در کلاس تعریف می‌کند.

line 5: console.log(`${this.name} makes a noise.`);
در اینجا، متد speak نام حیوان را به همراه یک پیام نمایش می‌دهد.

line 7: class Dog extends Animal {
این خط کلاس Dog را تعریف می‌کند که از کلاس Animal ارث بری می‌کند.

line 8: constructor(name) {
در این خط سازنده‌ی کلاس Dog تعریف می‌شود.

line 9: super(name);
در اینجا ما از super برای فراخوانی سازنده‌ی کلاس والد (Animal) استفاده می‌کنیم.

line 11: const dog = new Dog('Rex');
با این خط یک شیء جدید از کلاس Dog ایجاد می‌کنیم که نام آن 'Rex' است.

line 12: dog.speak();
در نهایت، متد speak را برای شیء dog فراخوانی می‌کنیم که خروجی 'Rex barks.' را چاپ می‌کند.

سوالات متداول

؟

چرا باید از super() استفاده کنم؟

؟

چگونه می‌توانم از خطای Super not called جلوگیری کنم؟

؟

آیا می‌توانم بدون استفاده از super() کار کنم؟

؟

این خطا بیشتر در کجا ظاهر می‌شود؟