Constructor در جاوا اسکریپت – توضیح توابع سازنده به زبان ساده


توابع سازنده یا Constructor در جاوا اسکریپت یکی از مفاهیم کلیدی در جاوا اسکریپت و برنامهنویسی شیءگرا هستند. در این مطلب از مجله فرادرس قصد داریم تا به طور کامل با این مفهوم و کاربرد آن آشنا شویم. ابتدا تعریف Constructor را مرور میکنیم و میبینیم چگونه یک تابع Constructor ساخته میشود. سپس نحوه فراخوانی توابع Constructor و انواع آنها را مثالهای عملی بررسی میکنیم. در ادامه با تفاوت Constructor و کلاس در جاوا اسکریپت آشنا میشویم. در نهایت نیز نکات کلیدی را جمعبندی خواهیم کرد. پس همراه ما باشید تا دانش خود را در زمینه توابع Constructor در جاوا اسکریپت ارتقا دهید.
توابع سازنده یا Constructor در جاوا اسکریپت راهکارهایی برای ایجاد و مقداردهی اولیه «شی» (Object) هستند که امکان تعریف ویژگیها و متدها را فراهم کرده و قابلیت استفاده مجدد کدهای برنامه را تقویت میکنند. همچنین «نمونهها» (Instances) با استفاده از سازنده ساخته میشوند و به برنامه نویسی شیگرا کمک میکنند. در مطلب پیش رو از «مجله فرادرس» مفهوم توابع سازنده در جاوا اسکریپت با زبانی ساده و به همراه مثالهای عینی پوشش داده شده است. درک Constructor در جاوا اسکریپت به برنامهنویسها کمک میکند که با چالشهای کدنویسی بهخصوص در رویکرد برنامه نویسی شیگرا بهتر و مجهزتر مواجه شوند.
تابع Constructor در جاوا اسکریپت چیست؟
تابع Constructor در جاوا اسکریپت به عنوان نوعی تابع معمولی، پایهای برای ساخت اشیا است. به عنوان مثال، یک مهندس عمران اگر بخواهد مجموعه آپارتمانی شامل چندین ساختمان را بسازد، برای ساخت این مجموعه اول نقشهای دقیق از پروژه ارائه کرده و سپس کار را به سایر افراد درگیر در پروژه مانند پیمانکار، کارگر و غیره میسپارد. در این پروژه اگر همه واحدهای آپارتمانی یک شکل باشند، فقط از این نقشه استفاده میشود و در این صورت هر آپارتمان (شی) بر اساس نقشه ارائه شده (تابع سازنده) ساخته خواهد شد. در نهایت، مجموعهای از چندین آپارتمان پدیدار میشود که همگی از طرح و نقشه اولیه واحدی استفاده کردهاند.
مزیت کلیدی این روش در توانایی تکرار طرح و ایجاد آرایهای از ۲۰، ۵۰۰، ۱۰۰ یا بیشتر اشیای مشابه با ویژگیهای متمایز است. تابع سازنده در جاوا اسکریپت به کاربر این امکان را میدهد که فقط یک بار چارچوب شی را ایجاد کند و سپس از این چارچوب برای ایجاد اشیای مشابهی میتواند بهره ببرد. توابع سازنده نقش مهمی در ایجاد اشیا در جاوا اسکریپت ایفا کرده و به عنوان الگوهایی برای ایجاد موجودیتهای متعددی عمل میکنند که ویژگیها و متدهای یکسانی را با حفظ مقادیر متنوع به اشتراک میگذارند.

نمونه ای از Constructor در دنیای واقعی
فرض بر این است که فردی توسعهدهنده در حال ساخت نوعی وبسایت رسانه اجتماعی است. این توسعهدهنده باید بداند که قصد جمعآوری چه اطلاعاتی را دارد. برای انجام این کار، توسعهدهنده برای هر کاربر چیزی شبیه به فرم ایجاد میکند تا از کاربران اطلاعات لازم را بگیرد. برای نشان دادن این روند، سناریوهای زیر را در نظر بگیرید:
- اطلاعات یکسان کاربر: در ثبتنام هر کاربر گرفتن مجموعهای از اطلاعت کاربر مانند نام، نامخانوادی، سن و غیره الزامی است. در نتیجه، اشیایی که برای جمعآوری دادههای کاربراهای متنوع طراحی شدهاند، ویژگیهای مشابهی را به اشتراک میگذارند.
- در نظر گرفتن مقیاس: فرض میشود روزانه مثلا هزاران نفر با این پلتفرم شبکه اجتماعی در تعامل هستند. برای مقیاسبندی کردن با این حجم از کاربران، اشیای متعددی باید برای مدیریت و پردازش مؤثر دادههای متمایز هر کاربر ایجاد شوند.
در سناریوی بالا، Constructor در جاوا اسکریپت طرح یا الگوی مورد استفاده برای ایجاد اشیای جدید است که برای هر کاربری که در پلتفرم ثبتنام میکند لازم خواهد بود و با استفاده از آن با کدنویسی بسیار کمتری کاربر توسعهدهنده به هدف خود که در این سناریو جمعآوری اطلاعات از کاربران است، دست مییابد.
ایجاد توابع Constructor در جاوا اسکریپت
ساخت توابع سازنده شبیه به ایجاد توابع معمولی جاوا اسکریپت است. در زیر مثالی برای نشان دادن این موضوع آورده شده است. تصور کنید مانند بالا فردی توسعهدهنده در حال ساخت نوعی سایت رسانه اجتماعی بوده و میخواهد اطلاعاتی را از کاربران جمعآوری کند. برای این هدف فرد توسعهدهنده نوعی تابع ویژه به نام Userایجاد میکند که شامل سه چیز است: نام، نامخانوادگی و سن کاربر. این تابع به او کمک میکند تا پروفایلهای کاربری متفاوتی ایجاد کند. قطعه کد زیر این موضوع را نشان میدهد:
در کد بالا تابعی با نامUserمانند طرحی اولیه عمل میکند. این تابع به فرد برنامهنویس اجازه میدهد تا تعداد زیادی پروفایل کاربری جدید برای سایت رسانه اجتماعی خود ایجاد کند. در رابطه با Constructor در جاوا اسکریپت توجه به دو نکته زیر مهم است:
- بهتر است نام تابع سازنده با حرف بزرگ شروع شود. انجام این کار اجباری نیست اما به کاربر کمک میکند توابع سازنده را از توابع معمولی جدا کند.
- هنگام کار با توابع سازنده در جاوا اسکریپت از کلمه کلیدی This در جاوا اسکریپت زیاد استفاده میشود. این کلمه کلیدی برای اشاره به شیئی که کاربر ایجاد کرده مورد استفاده قرار میگیرد.

کلمه کلیدی This در جاوا اسکریپت
کلمه کلیدی This در جاوا اسکریپت به نوعی شی اشاره میکند اما اینکه به کدام شی اشاره خواهد کرد بستگی به محل استفاده دارد. برای درک بهتر این موضوع توجه به ٣ نکته زیر مهم است:
- در داخل شی: هنگامیکه کلمه کلیدی نام برده در داخل شیئی استفاده میشود، thisبه آن شی خاص اشاره دارد.
- در محدوده سراسری: اگر خارج از هر شی خاصی استفاده شود، مانند قسمت اصلی کد، thisبه زمینه بزرگتر اشاره دارد که معمولاً کل صفحهوب یا محیط سراسری را شامل میشود.
- در توابع یا کلاسهای سازنده: وقتی این کلمه کلیدی در داخل تابعی خاص قرار میگیرد که اشیا ایجاد میکند (تابع سازنده یا کلاس)، thisنشاندهنده شی خاصی است که در آن لحظه ایجاد میشود.
به عبارت سادهتر، کلمه کلیدی thisبه کاربر کمک میکند جزئیات یا اقداماتی را به اشیای مختلف اضافه کند. به عنوان مثال، هنگام ساخت بسیاری از اشیای مشابه، مانند پروفایل کاربر در مثال بالا، برنامهنویس نمیخواهد به هر کدام از اشیا نام منحصربهفردی بدهد. در عوض، از thisبرای سفارشیسازی و ساخت هر شی به طور جداگانه استفاده میکند. بنابراین، thisمانند ابزاری است که به کاربر امکان میدهد ویژگیهای خاصی را به اشیا اضافه کند، به خصوص اگر این اشیا همگی از یک طرح اولیه ساخته شده باشند.
فراخوانی تابع سازنده در جاوا اسکریپت
برای استفاده از تابع Constructor در جاوا اسکریپت، از کلمه کلیدی Newبه همراه دادههای واقعی ارائه شده استفاده میشود که مثال زیر این موضوع را نشان میدهد:
در کد بالا، شی (نمونه) خاصی از سازنده Userتولید میشود که شامل سه مؤلفه زیر است:
Firstname as ‘John’ Lastname as ‘Doe’ Age as 23.
کلمه کلیدی Newعملگری برای ایجاد اشیای جدید از توابع سازنده است. هنگامیکه از کلمه کلیدی Newبا یک تابع سازنده استفاده شود، کارهای زیر را انجام میدهد:
- شی تازه و خالی ایجاد میکند.
- نمونه اولیه این شی جدید را تنظیم کرده و آن را به ویژگی نمونه اولیه تابع سازنده متصل میکند.
- کلمه کلیدی thisتابع سازنده را طوری تنظیم میکند که به شی جدید ایجاد شده اشاره کند.
- کلمه کلیدیNewتابع سازنده را وادار میکند که شی جدید را بازگرداند.
در مثال زیر، تابعی به نام newCloneرفتار عملگر Newرا تقلید میکند:
هر دو شی newCloneو user1نتیجه یکسانی دارند:
اضافه کردن متدها به سازنده ها
هنگامی استفاده از توابع Constructor در جاوا اسکریپت، علاوه بر اضافه کردن جزئیات اولیه به اشیا، میتوان کارهای بیشتری نیز انجام داد و متدها را به توابع سازنده اضافه کرد. دو روش برای قرار دادن متدها در توابع سازنده وجود دارد که در ادامه این دو روش مورد بررسی قرار گرفتهاند.

١. در داخل سازنده
میتوان متد را مستقیماً در تابع سازنده ایجاد کرد. به عنوان مثال، در سازنده User، میتوان متدی به نام speakمانند مثال زیر اضافه کرد:
۲. استفاده از نمونههای اولیه
راه دیگر افزودن متدها به توابع سازنده در جاوا اسکریپت، استفاده از نمونههای اولیه است. این رویکرد روشی خاص برای به اشتراک گذاشتن متدها در بین تمام اشیا ایجاد شده از سازنده است. برای مثال، میتوان متدی به نام getFullNameبا استفاده از نمونههای اولیه به سازنده User مانند مثال زیر اضافه کرد:
با افزودن متدها از طریق نمونههای اولیه، تمام اشیای ساخته شده از سازنده Userمیتوانند از متد جدید استفاده کنند که راهی برای در دسترس قرار دادن عملی مشابه برای همه اشیای مشابه است.
انواع توابع Constructor در جاوا اسکریپت چه هستند؟
دو نوع اصلی توابع Constructor در جاوا اسکریپت وجود دارد که شامل توابع سازنده تعریف شده به وسیله کاربر و توابع سازنده داخلی هستند. هرکدام از این توابع کاربردهای خاص خودشان را دارند و در سناریوهای مختلفی میتوان از آنها استفاده کرد. در ادامه توضیحاتی در رابطه با هرکدام از انواع توابع سازنده در جاوا اسکریپت آورده شده است.
١. توابع سازنده تعریف شده به وسیله کاربر
توابع سازنده تعریف شده به وسیله کاربر، توابعی هستند که توسعهدهندگان برای نیازهای خاص خود در برنامه کاربردی ایجاد و تعریف میکنند. تابع سازنده که قبلاً در مورد آن صحبت کردیم در این دسته قرار میگیرد. این توابع در اصل به وسیله توسعهدهندگان طراحی شدهاند تا در کد آنها استفاده شود.
٢. توابع سازنده داخلی
جاوا اسکریپت توابع سازنده داخلی را برای هر نوع داده اولیه، مانند «رشته» (استرینگ | String)، عدد، بولی و شی فراهم میکند. برای مثال قطعه کد زیر چند نمونه از توابع سازنده داخلی در جاوا اسکریپت را نشان میدهد:
پس از اجرای قطعه کد بالا، متوجه خواهیم شد که هر کدام شیئی را به عنوان خروجی بازگشت دادهاند. این اتفاق به دلیل اینکه تمام سازندههای جاوا اسکریپت اشیا را بازمیگردانند، رخ داده است. اگرچه جاوا اسکریپت دارای اشیای خاصی بوده که قابلیت استفاده به عنوان اعداد، رشتهها و غیره را دارند اما استفاده از این اشیا میتواند روی عملکرد برنامه کاربر تاثیر بگذارد. مقادیر نوع داده اولیه معمولاً برای بیشتر کاربردهای رایج، سریعتر و کارآمدتر هستند.

نمونه های اولیه شی در جاوا اسکریپت
جاوا اسکریپت نوعی زبان پویا است که به کاربر این امکان را میدهد تا در هر مکان و زمانی ویژگیهای جدیدی را به اشیا اضافه کند. مثال زیر این موضوع را نشان میدهد:
در کد بالا، ویژگی ageفقط در شی person1وجود دارد، نه person2، زیرا فقط بهperson1اضافه شده است. اما چگونه میتوان ویژگیهای جدیدی را پس از تعریف تابع سازنده به آن اضافه کرد و آنها را برای همه نمونههای شی در دسترس قرار داد؟ پاسخ این سؤال در چیزی به نا، «نمونه اولیه» یا Protoype در جاوا اسکریپت نهفته است.
در جاوا اسکریپت، هر تابعی با مؤلفهای خاص به نام «نمونه اولیه» (Protoype) همراه است. نمونه اولیه در ابتدا شیئی خالی در داخل تابع محسوب میشود و تا زمانی که تابع به عنوان سازنده استفاده نشود، غیرفعال میماند. ویژگی نمونه اولیه تابع Constructor در جاوا اسکریپت به عنوان نمونه اولیه برای تمام اشیای ایجاد شده از آن تابع عمل میکند. توجه به مثال زیر و نتیجه آن در این رابطه بسیار مهم است:
همانطور که در نتایج مشاهده میشود، هر دو نمونه شی ایجاد شده از سازنده Personاکنون میتوانند به ویژگی ageکه در نمونه اولیه سازنده Personقرار دارد دسترسی داشته باشند. این رویکرد نمونه اولیه ویژگیهای مشترک را در بین نمونهها فعال میکند.
تفاوت اشیای ساخته شده با سازنده و اشیای واقعی در جاوا اسکریپت
دو رویکرد برای ایجاد اشیا در جاوا اسکریپت موجود است که شامل «اشیای تحت اللفظی »(Object literal) (به معنی اشیای واقعی) و سازندهها هستند. رویکرد اشیای تحت اللفظی شامل تعریف مستقیم خصوصیات و مقادیر شی است. به عنوان مثال کد زیر جزئیات مربوط به ٣ دانش آموزان را میگیرد. برای دانش آموز اول باید به صورت زیر عمل کند:
برای دانش آموزش دوم به صورت زیر است:
برای دانش آموز سوم به صورت زیر است:
راه سریعتری برای ساخت شی studentوجود دارد. به جای ایجاد دستی هر شی studentبا استفاده شی واقعی، میتوان از سازنده استفاده کرد. این شامل طراحی تابعی است که به عنوان طرحی برای تولید هر تعداد شی studentعمل کند. در اصل روش دوم استفاده از رویکرد توابع سازنده است. روش اول بهویژه در سناریوهایی که اشیای متعدد موجود هستند، کارآمدی کمتری دارد و روش دوم تا حدودی این مشكل را حل کرده است. در این روش بهجای تکرار جزئیات، میتوان الگو یا تابع Constructor در جاوا اسکریپت را برای تولید اشیا استفاده کرد. مثال زیر برای بیان این موضوع است:
تمایز دو رویکرد بالا در اثربخشی آنها نهفته است. رویکرد اشیای واقعی نیاز به تعیین نوع اضافی برای هر شی دارد، در حالی که رویکرد استفاده از توابع سازنده شامل طراحی تابعی الگو محور بهمنظور سادهسازی فرآیند تولید چندین شی است. در اصل، هنگامی که کاربر با شیئی منفرد با ویژگیهای خاص سروکار داشته باشد، استفاده از رویکرد اشیای واقعی انتخاب مناسبتری است. در همین حال، هنگام برخورد با مجموعههایی زیادی از اشیا که هر کدام دارای ویژگیهای مشابه هستند، توابع Constructor در جاوا اسکریپت انتخاب بهتری محسوب میشود. این رویکرد نهتنها سریعتر است، بلکه سازماندهی کدها را نیز بهبود میبخشد.

تفاوت کلاس و Constructor در جاوا اسکریپت
جاوا اسکریپت به دلیل رویکرد منحصربهفردش که بهجای کلاسها بر سازندهها و نمونههای اولیه تکیه میکند، در میان دیگر زبانهای برنامهنویسی شیگرا متمایز است. در واقع، برای دورهای قابلتوجه در جاوا اسکریپت حتی چیزی به نام کلاس وجود نداشت. معرفی کلاسهای جاوا اسکریپت در «ECMAScript 2015» هیچ قابلیت جدیدی برای خود زبان به ارمغان نیاورد. در عوض، کلاسها به عنوان شکلی از «قند نحوی | به معنای کد خوانا و راحت» (Syntactic Sugar) عمل کرده و خوانایی و نوشتن کد را بر روی توابع Constructor موجود ساده میکنند.
کلاسها و توابع Constructor در جاوا اسکریپت به هم مرتبط هستند و شباهتهایی در نحوه کار و دستاوردهایشان دارند. در حالی که آنها ممکن است از سینتکس متفاوتی استفاده کنند و تفاوتهایی با هم داشته باشند اما هدف اساسی یکسانی را از ایجاد اشیا و تعریف ویژگیها و رفتار آنها دنبال میکنند. برای تعریف کلاس جاوا اسکریپت، از کلمه کلیدی classاستفاده میشود که مثال زیر این موضوع را بیان میکند:
در داخل اعلان کلاس، میتوان متدی به نام Constructor()را وارد کرد که عملکردی مشابه تابع سازنده دارد. این متد سازنده از اختصاص دادن خصوصیات در کلاس مراقبت میکند. وجود متد Constructor()در اعلان کلاس بر این واقعیت تأکید خواهد کرد که کلاسهای جاوا اسکریپت اساساً بر اساس توابع سازنده ساخته شدهاند.
سخن پایانی
توابع Constructor در جاوا اسکریپت به عنوان طرح اولیه برای ایجاد اشیا با ویژگیها و متدهای از پیش تعریف شده عمل میکنند. این توابع رویکردی ساختاریافته برای نمونهسازی کارآمد شی ارائه خواهند کرد. سازندهها چه از توابع سازنده معمولی استفاده کنند و چه از سینتکس کلاس محور، سازماندهی کد و قابلیت استفاده مجدد را افزایش میدهند. یادگیری سازندهها، توسعهدهندگان را قادر میسازد تا به طور کارآمد اشیا را مدیریت و دستکاری کرده و این به ایجاد برنامههای قویتر و با قابلیت نگهداری بالا کمک میکند. با درک این مفهوم اساسی، توسعهدهندگان میتوانند از پتانسیل کامل قابلیتهای برنامه نویسی شیگرا در جاوا اسکریپت بهره ببرند.
در مطلب فوق از مجله فرادرس توابع Constructor و نحوه کار آنها به زبانی ساده و در قالب مثالهایی ارائه شد. همچنین نحوه ایجاد و فراخوانی این توابع، انواع آنها، تفاوت آنها با نمونههای اولیه و همچنین فرق آنها با کلاسها نیز مورد بررسی قرار گرفت. به امید اینکه مطلب فوق مورد رضایت کاربران مجله قرار گرفته باشد.