مقدمه

تا اینجا با ساخت اشیاء معمولی، متدها و رفتار this آشنا شدیم. اما اگر بخواهیم تعداد زیادی شیء مشابه با خصوصیات و رفتارهای مشترک ایجاد کنیم، کپی کردن کد برای هر شیء هم کدنویسی را دشوار می‌کند و هم خوانایی پروژه را پایین می‌آورد. راه‌حل استاندارد این کار در جاوااسکریپت، استفاده از توابع سازنده (constructor) و عملگر new است. در این درس با این مفاهیم آشنا می‌شویم و کاربردشان را در تولید اشیاء مشابه به صورت حرفه‌ای یاد می‌گیریم.

سازنده‌ها و عملگر new

توابع سازنده یا constructor ابزاری هستند برای ساخت اشیاء مشابه و قابل توسعه. با استفاده از این توابع، می‌توانید تعداد زیادی شیء بسازید که همگی ویژگی‌های اولیه مشابه دارند اما مقادیر مخصوص خودشان را دریافت می‌کنند.

یک تابع سازنده در جاوااسکریپت در واقع یک تابع معمولی است که نامش با حرف بزرگ (Capital) شروع می‌شود و به جای مقداردهی متغیرها، مقادیر را با استفاده از this به شیء فعلی نسبت می‌دهد. در کد زیر نمونه‌ای از تعریف یک سازنده را می‌بینید.

Copy Icon JAVASCRIPT
function User(name, age) {
  this.name = name;
  this.age = age;
  this.sayHi = function() {
    console.log("Hello, My name is " + this.name);
  };
}

در اینجا تابع User نقش یک سازنده را ایفا می‌کند و برای هر شیء جدید، پراپرتی‌ها را روی this تعریف می‌کند.

برای ساخت شیء جدید از یک سازنده، باید آن را با عملگر new فراخوانی کنید. این کار باعث می‌شود یک شیء جدید ساخته شود، this به آن اشاره کند و خروجی تابع همان شیء باشد. کد زیر را ببینید.

Copy Icon JAVASCRIPT
let user1 = new User("Ali", 28);
let user2 = new User("Sara", 35);

user1.sayHi(); // Hello, My name is Ali
user2.sayHi(); // Hello, My name is Sara
console.log(user1.age); // 28
console.log(user2.age); // 35

همانطور که در کد بالا می‌بینید، هر بار که سازنده را با new صدا می‌زنید، یک شیء جدید و مستقل با مقادیر پراپرتی‌های مخصوص به خودش ساخته می‌شود.

رفتار عملگر new و تفاوت با توابع معمولی

وقتی یک تابع را با new فراخوانی می‌کنید، این اتفاق می‌افتد:

  • یک شیء جدید ساخته می‌شود.
  • this به آن شیء جدید اشاره می‌کند.
  • بدنه تابع اجرا می‌شود و پراپرتی‌ها به this نسبت داده می‌شود.
  • در پایان، شیء جدید به عنوان خروجی برگردانده می‌شود.

اگر فراموش کنید از new استفاده کنید، this به جای شیء جدید، به شیء Global یا undefined اشاره می‌کند (بسته به مود legacy یا strict)، و پراپرتی‌ها جایی که انتظار دارید ذخیره نمی‌شوند. پس همیشه سازنده‌ها را با new فراخوانی کنید.

Copy Icon JAVASCRIPT
let user = User("Ali", 22);
console.log(user); // undefined!

اینجا چون new فراموش شده، تابع User یک شیء جدید نمی‌سازد و خروجی آن undefined است.

مزیت سازنده‌ها و حرفه‌ای‌تر کردن کدها

با استفاده از سازنده‌ها، می‌توانید کدهای تکراری را حذف کنید و تعداد زیادی شیء مشابه با رفتار مشترک بسازید. این الگو زیربنای مفهوم کلاس‌ها (class) در نسخه‌های جدید جاوااسکریپت است و باعث سازمان‌دهی حرفه‌ای پروژه‌های بزرگ می‌شود.

برای صرفه‌جویی در مصرف حافظه و اشتراک متدها میان همه اشیاء ساخته‌شده، می‌توانید متدها را روی پروتوتایپ سازنده تعریف کنید. این موضوع در فصل کلاس‌ها و برنامه‌نویسی شی‌گرا به طور کامل بررسی خواهد شد.

سازنده‌ها و عملگر new به شما اجازه می‌دهند اشیاء مشابه و حرفه‌ای تولید کنید، بدون آنکه نیاز به تکرار دستی کدها یا کپی متدها داشته باشید. این مفاهیم زیربنای کلاس‌ها در جاوااسکریپت هستند و تسلط بر آن‌ها برای پروژه‌های واقعی کاملاً ضروری است.

در درس بعد با تکنیک Optional Chaining برای دسترسی امن به پراپرتی‌های تو در توی اشیاء آشنا خواهیم شد.