مقدمه
جاوااسکریپت تعدادی کلاس داخلی (Built-in) مانند Array، Error، Map و ... دارد. شما میتوانید
این کلاسها را با extends گسترش دهید و متدهای سفارشی یا پراپرتیهای جدید اضافه کنید. این
قابلیت راه را برای ساخت ابزارهای خاص و رفتارهای پیشرفته بر پایه ساختارهای استاندارد باز میکند.
با بسط کلاسهای داخلی میتوانید نیازهای تخصصی پروژه خود را بر بستر ساختارهای سریع و استاندارد
پیادهسازی کنید و در عین حال از تمام قابلیتها و بهینگی کلاسهای اصلی بهره ببرید.
بسط یک کلاس داخلی با extends
کافی است کلاس خود را با کلمه کلیدی extends از یکی از کلاسهای داخلی مشتق کنید و متد یا
پراپرتی جدیدی به آن بیفزایید. این تکنیک برای ساخت Array یا Error سفارشی و حتی
Map و Set حرفهای
استفاده میشود.
در مثال زیر یک کلاس MyArray ساختهایم که متد sum را به Array افزوده است.
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());
console.log(arr instanceof MyArray);
در این مثال، کلاس MyArray تمام ویژگیهای Array را به ارث میبرد و متد جدید sum
را اضافه میکند. بنابراین میتوانید مانند یک آرایه معمولی از آن استفاده کنید و علاوه بر آن، متد
sum را نیز در اختیار دارید.
پیادهسازی خطاهای سفارشی با بسط کلاس Error بسیار ساده است. مثال زیر را ببینید.
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 و سازندهها
نکته دیگری که باید به آن توجه داشته باشید این است که
نمونههای ایجادشده از کلاس بسطیافته هم نمونه آن کلاس و هم نمونه کلاس والد داخلی هستند.
کد زیر را ببینید.
JAVASCRIPT
console.log(arr instanceof MyArray);
console.log(arr instanceof Array);
در اینجا
نمونه arr همزمان هم یک MyArray و هم یک
Array است. این یعنی تمام متدهای آرایه را دارد و همچنین متدهای
سفارشی شما را نیز پشتیبانی میکند. این ویژگی برای اطمینان از سازگاری با کدهای موجود و استفاده از
قابلیتهای استاندارد بسیار مهم است.
بسط کلاسهای Built-in، ساخت ابزارها و دادهساختارهای تخصصی با عملکرد حرفهای را بسیار سادهتر
میکند. با این تکنیک میتوانید بر پایه قابلیتهای پیشفرض زبان، ابزارهای اختصاصی و قابل توسعه
بسازید.
بعد از بسط کلاسهای Built-in، حتماً نمونهسازی و تست رفتارهای آن را انجام دهید تا از هماهنگی و
عملکرد صحیح مطمئن شوید.