مقدمه

جاوااسکریپت تعدادی کلاس داخلی (Built-in) مانند Array، Error، Map و ... دارد. شما می‌توانید این کلاس‌ها را با extends گسترش دهید و متدهای سفارشی یا پراپرتی‌های جدید اضافه کنید. این قابلیت راه را برای ساخت ابزارهای خاص و رفتارهای پیشرفته بر پایه ساختارهای استاندارد باز می‌کند. با بسط کلاس‌های داخلی می‌توانید نیازهای تخصصی پروژه خود را بر بستر ساختارهای سریع و استاندارد پیاده‌سازی کنید و در عین حال از تمام قابلیت‌ها و بهینگی کلاس‌های اصلی بهره ببرید.

بسط یک کلاس داخلی با extends

کافی است کلاس خود را با کلمه کلیدی extends از یکی از کلاس‌های داخلی مشتق کنید و متد یا پراپرتی جدیدی به آن بیفزایید. این تکنیک برای ساخت Array یا Error سفارشی و حتی Map و Set حرفه‌ای استفاده می‌شود.

در مثال زیر یک کلاس MyArray ساخته‌ایم که متد sum را به Array افزوده است.

Copy Icon JAVASCRIPT
class MyArray extends Array {
  sum() {
    return this.reduce((acc, x) => acc + x, 0);
  }
}

let arr = new MyArray(1, 2, 3);
console.log(arr.sum()); // 6
console.log(arr instanceof MyArray); // true

در این مثال، کلاس MyArray تمام ویژگی‌های Array را به ارث می‌برد و متد جدید sum را اضافه می‌کند. بنابراین می‌توانید مانند یک آرایه معمولی از آن استفاده کنید و علاوه بر آن، متد sum را نیز در اختیار دارید.

پیاده‌سازی خطاهای سفارشی با بسط کلاس Error بسیار ساده است. مثال زیر را ببینید.

Copy Icon JAVASCRIPT
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}
throw new ValidationError("Invalid value");

در اینجا با بسط کلاس Error و تعیین name، می‌توانید نوع خطا را به‌راحتی تشخیص دهید و مدیریت بهتری روی خطاهای سفارشی داشته باشید. این روش برای ساخت خطاهای دامنه‌ای (Domain Errors) یا اعتبارسنجی بسیار کاربردی است.

نکات و محدودیت‌های بسط کلاس‌های داخلی

در بسط برخی کلاس‌ها مانند Array باید دقت کنید که پراپرتی‌های پیش‌فرض و سازنده‌ها به درستی فراخوانی شوند. همه کلاس‌های داخلی قابلیت بسط ندارند و بعضی از کلاس‌ها (مانند Date) به خوبی کار نمی‌کنند. معمولاً کلاس‌های مدرن مانند Array، Error، Map و Set قابل بسط هستند.

بررسی instanceof و سازنده‌ها

نکته دیگری که باید به آن توجه داشته باشید این است که نمونه‌های ایجادشده از کلاس بسط‌یافته هم نمونه آن کلاس و هم نمونه کلاس والد داخلی هستند. کد زیر را ببینید.

Copy Icon JAVASCRIPT
console.log(arr instanceof MyArray); // true
console.log(arr instanceof Array);   // true

در اینجا نمونه arr همزمان هم یک MyArray و هم یک Array است. این یعنی تمام متدهای آرایه را دارد و همچنین متدهای سفارشی شما را نیز پشتیبانی می‌کند. این ویژگی برای اطمینان از سازگاری با کدهای موجود و استفاده از قابلیت‌های استاندارد بسیار مهم است.

بسط کلاس‌های Built-in، ساخت ابزارها و داده‌ساختارهای تخصصی با عملکرد حرفه‌ای را بسیار ساده‌تر می‌کند. با این تکنیک می‌توانید بر پایه قابلیت‌های پیش‌فرض زبان، ابزارهای اختصاصی و قابل توسعه بسازید.

بعد از بسط کلاس‌های Built-in، حتماً نمونه‌سازی و تست رفتارهای آن را انجام دهید تا از هماهنگی و عملکرد صحیح مطمئن شوید.