شاید مهمترین وظیفهی یک کلاس این باشد که به عنوان یک «کارخانه» برای تولید اشیاء عمل کند. به عنوان مثال، وقتی از متد سازندهی Date استفاده میکنیم، انتظار داریم یک Object جدید به ما تحویل دهد که نمایندهی دادههای تاریخی باشد که به آن پاس دادهایم؛ دادههایی که بعداً میتوانیم با متدهای دیگری که آن Instance در اختیارمان میگذارد، رویشان کار کنیم. در دنیای کلاسها، وظیفهی ساختِ این نمونهها بر عهدهی constructor است.
برای مثال، کلاس جدیدی به نام Color میسازیم که نمایندهی یک رنگ خاص است. کاربران میتوانند با پاس دادن سه عدد اصلیِ رنگ (RGB triplet)، رنگهای مورد نظر خود را بسازند:
class Color {
constructor(r, g, b) {
// مقادیر RGB را به عنوان یک Property به `this` اختصاص میدهیم.
this.values = [r, g, b];
}
}
اگر ابزار توسعهدهندگان مرورگر خود (DevTools) را باز کنید و این کد را در کنسول اجرا کنید، میتوانید یک نمونه (Instance) بسازید:
const red = new Color(255, 0, 0);
console.log(red);
در کنسول خروجی شبیه به این خواهید دید:
Object { values: (3) […] }
values: Array(3) [ 255, 0, 0 ]
شما با موفقیت یک نمونه از کلاس Color ساختید که این نمونه ویژگیِ values را درون خود دارد (آرایهای از همان مقادیر RGB که پاس داده بودید). این کار تقریباً معادل است با اینکه چنین تابعی مینوشتید:
function createColor(r, g, b) {
return {
values: [r, g, b],
};
}
نحوِ (Syntax) متد constructor دقیقاً مشابه یک تابع معمولی است؛ این یعنی شما میتوانید از قابلیتهای دیگر توابع، مثل پارامترهای باقیمانده (Rest parameters) نیز در آن استفاده کنید:
class Color {
constructor(...values) {
this.values = values;
}
}
const red = new Color(255, 0, 0);
// یک نمونه دقیقاً با همان ساختار قبلی ایجاد میکند.
هر بار که شما کلمه کلیدی new را صدا میزنید، یک نمونهی کاملاً مجزا و متفاوت ساخته میشود:
const red = new Color(255, 0, 0);
const anotherRed = new Color(255, 0, 0);
console.log(red === anotherRed); // خروجی: false
درون متد سازندهی یک کلاس، مقدار this مستقیماً به شیءِ تازه ساختهشده (New instance) اشاره میکند. شما میتوانید ویژگیهای جدیدی به آن اختصاص دهید یا ویژگیهای موجود (بهویژه متدها) را از روی آن بخوانید.
مقدار this به صورت خودکار به عنوان خروجی و نتیجهی دستور new برگشت داده میشود. به همین خاطر، توصیه میشود که هرگز مقداری را از داخل متد constructor ریترن نکنید؛ زیرا اگر یک مقدار غیرِ اولیه (Non-primitive value مثل یک Object دیگر) را بازگردانید، همان مقدار به خروجیِ دستور new تبدیل میشود و شیءِ ساختهشده بر پایهی this کاملاً نادیده گرفته شده و از بین میرود.
class MyClass {
constructor() {
this.myField = "foo";
return {}; // یک شیء خالی برمیگرداند و this را دور میاندازد!
}
}
console.log(new MyClass().myField); // خروجی: undefined
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript