nodejs پیاده سازی زبان JavaScript برای برنامه نویسی Backend هست.
شاید پیچیدگی مساله برای شما در این هست که توابع از نوع object هستند و در عین حال توابع برای ساختن objectهای دیگر هم استفاده می شود.
توابع objectهایی هستند می توانند صدا زده شوند. مانند
foo(str) {
this.name = str
}
چون foo یک object هست پس می تونیم روی آن property تعریف کنیم:
foo.version = 1.2;
console.log(foo.version) // 1.2
حالا بیایم و تابع رو صدا بزنیم:
در این صدا زدن this به هر objectای که اشاره کند (می تونه this به هر چیزی در این لحظه اشاره کنه) اون object یک property با اسم name و مقدار ۱.۲ می گیرد و undefined برمی گرداند.
حالا بیایم و این تابع را با keyword new صدا بزنیم: در این حالت قبل از اجرای کد داخل تابع موتور JavaScript (که در سوال شما nodejs) هست یک object خالی می سازد و آدرس آن را در this نگه می دارد. بعد از این مراحل کد درون تابع اجرا می شود و به آن object خالی property با نام name و مقدار 'sam' داده می شود و در نهایت آدرس آن object برگردانده می شود.
اگر تجربه برنامه نویسی با یک زبان شیی گرا را دارین و می خوایید متوجه شوید در JavaScript چگونه می تونید اون مفاهیم رو پیاده کنید می تونید به لینک JavaScript Class - DashBrace مراجعه کنید.