javascriptConstructor and newسازنده و new در جاوااسکریپت
new در جاوااسکریپت برای ساخت نمونه از سازنده است؛ مقداردهی با this، مستقلبودن دو نمونه و تفاوت آن با فراخوانی تابع معمولی را ببینید.
مفهوم به زبان ساده
گاهی چند شیء با ساختار آغازین مشابه لازم داریم؛ مثلاً هر درس عنوان و وضعیت انجامشدن دارد. سازنده، راهی برای مقداردهی چنین نمونههایی است. یک تابع معمولیِ مناسب میتواند با new بهعنوان سازنده فراخوانی شود. در حالت رایج، new شیء تازه میسازد، this سازنده را به آن متصل میکند و همان نمونه را پس از مقداردهی برمیگرداند.
در مثال، هر فراخوانی new Lesson عنوان متفاوت و وضعیت اولیهٔ false را در نمونهٔ تازه قرار میدهد. تغییر done در first، وضعیت second را تغییر نمیدهد؛ آنها دو شیء جدا هستند. نام سازنده را معمولاً با حرف بزرگ آغاز میکنیم؛ این رسم نقش آن را تغییر نمیدهد. برای تشخیص نقش، شیوهٔ تعریف و فراخوانی را بخوانید.
سازندهٔ تابعی را بدون new مانند تابع معمولی صدا نزنید، مگر قرارداد آن عمداً چنین استفادهای را پشتیبانی کند. تابع پیکانی سازنده نیست و با new کار نمیکند. کلاس نیز با new نمونهسازی میشود، اما فراخوانی مستقیم آن مجاز نیست. این مدخل شناخت اولیهٔ ساخت نمونه را آموزش میدهد؛ برای دو شیء ساده، نوشتن مستقیم شیء هم انتخاب مناسبی است. برای تمرین، درس سومی بسازید و استقلال وضعیت آن را با دو درس قبلی بررسی کنید.
کجا به کار میآید؟
- ساخت چند نمونه با مقداردهی اولیهٔ یکسان
- خواندن کدی که از سازندههای زبان یا سازندهٔ برنامه استفاده میکند
از تعریف تا یک مثال واقعی
function Lesson(title) {
this.title = title;
this.done = false;
}
const first = new Lesson('متغیر');
const second = new Lesson('تابع');
first.done = true;
console.log(first.title);
console.log(first.done);
console.log(second.done);
console.log(first === second);
متغیر true false false
این مثال چطور کار میکند؟
new برای first یک نمونه با عنوان متغیر میسازد.
فراخوانی دوم، شیء مستقل دیگری با done برابر false میسازد.
فقط وضعیت first تغییر میکند؛ مقایسهٔ دو مرجع false است.
اشتباه رایج
هر تابعی را نمیتوان سازنده دانست؛ تابع پیکانی با new خطا میدهد. حذف new از فراخوانی سازندهٔ تابعی نیز میتواند this و نتیجه را عوض کند.
این را به خاطر بسپارید
new نمونه میسازد و سازنده دادهٔ آغازین آن را تعیین میکند؛ هر فراخوانی معمولاً نمونهٔ جدا دارد.