# زبان های اسکریپتی > JavaScript و Framework های مبتنی بر آن > Node.js >  توابع و اشیا

## tempel

سلام،1- function literal ها دقیقا چه نوع داده ای هستند و چطور می توانند بی نام باشند و دریک متغیر ذخیره شوند؟

2-اشیا در js و nodejs به چه صورت تعریف می شوند؟

مثلا میگن توابع در nodejs(jsیا) آبجکت هستنددرصورتی که نه کلاسی درکار است و نه تعاریفی مانند دیگر زبان های شی گرا


var person = function(name){
this.name = name;
}

var someone = new person("someone")


دراینجا person خود نقش یک آبجکت رو داره درحالیکه ما با دستور new از روی شی دوباره کپی می کنیم!

3-کاری که یک تابع دراینجا انجام می دهد هم ارز همون کاری است که شی تابع برای ما انجام می دهد پس تفاوت این دو دقیقا چیست؟

4-تفاوت تعریف یک کلاس(شی یا تابع) به صورت بالا با


function person(name){
this.name = name;
}


چیست؟به جای literal از نام تابع استفاده کردیم 

5-اگر برای function literal نامی بگذاریم نامش جه کاربردی دارد؟

----------


## plague

البته سوالاتتون ربطی به nodejs ندارن .
اینا مبانی javascript هستن که البته زبانیه که نود ازش استفاده میکنه 
نود رو میتوین به چشم یک موتور یا در برگیرنده در نظر بگیری که دستورات js رو تبدیل میکنه به C++‎ که میتونن رو سرور ران بشن 


اشیا در js مثل زبان های دیگه کلاس بیس نیستن در نتیجه شما کلاسی نمیبینی و کانسپت کلاس رو نداره که ساختار شی از قبل توش تعریف شده باشه 
اشیا در js  یه سری کلید و مقدار هستن  که به هم ربط داده میشن
شما میتونی یک شی رو به صورت داینامیک بسازی 

var obj = {};
obj.key = 'val' ;





خیلی وقتا از توابع برای ساخت و پرکردن شی  استفاده میشه (Constructor ) 


function createObject(val){

var obj = {} ; 
obj.key = val ;
return obj ; 

}

createObject('something');



در نتیجه یه شوتر کات یا کد ساده شده براش ساخته شده 



function createObject(val){
obj.key = val ;
}

var obj = new  createObject('something');




 در واقع وقتی شما از کلید new استفاده میکنی برای صدا کردن یک تابع داری میگی که این تابع برای ساخت و پر کردن مقادیر یک آبجکت هستش در نتیجه توی تابع نیاز نیست دیگه اون دو خط اول و آخر رو بنویسی و خودش ترتیب اونا رو میده 
منظور از دو خط اینا هستن 

var obj = {} ; 
return obj ; 

اینجا کلمه new معنا و مفهومی که توی زبان های دیگه داره رو نداره و با اون ذهنیت بهش نباید نگاه بکنی

و البته ما اینجا از نام obj استفاده کردیم
برای آبجکتمون د راین حالت باید از this بجاش استفاده کنیم یعنی اینجوری میشه 

function createObject(val){
this.key = val ;
}

var obj = new  createObject('something');




یه فیلم آموزشی خیلی خوب هست که قسمت های عجیبش رو توضیح داده

https://downloadly.ir/elearning/vide...e-weird-parts/

دانلود کن ببین خیلی چیزا دستت میاد 

همچنین یه فیلم تو یوتوب هست که توابع و شی گرایی رو توضیح داده


https://www.youtube.com/watch?v=fBpP...dn0c_u&index=1

----------


## plague

البته سوالاتتون ربطی به nodejs ندارن .
اینا مبانی javascript هستن که البته زبانیه که نود ازش استفاده میکنه 
نود رو میتوین به چشم یک موتور یا در برگیرنده در نظر بگیری که دستورات js رو تبدیل میکنه به C++‎‎‎ که میتونن رو سرور ران بشن 


اشیا در js مثل زبان های دیگه کلاس بیس نیستن در نتیجه شما کلاسی نمیبینی و کانسپت کلاس رو نداره که ساختار شی از قبل توش تعریف شده باشه 
اشیا در js  یه سری کلید و مقدار هستن  که به هم ربط داده میشن
شما میتونی یک شی رو به صورت داینامیک بسازی 

var obj = {};
obj.key = 'val' ;





خیلی وقتا از توابع برای ساخت و پرکردن شی  استفاده میشه (Constructor ) 


function createObject(val){

var obj = {} ; 
obj.key = val ;
return obj ; 

}

createObject('something');



در نتیجه یه شورت کات یا کد ساده شده براش ساخته شده 



function createObject(val){
obj.key = val ;
}

var obj = new  createObject('something');




 در واقع وقتی شما از کلید new استفاده میکنی برای صدا کردن یک تابع داری میگی که این تابع برای ساخت و پر کردن مقادیر یک آبجکت هستش در نتیجه توی تابع نیاز نیست دیگه اون دو خط اول و آخر رو بنویسی و خودش ترتیب اونا رو میده 
منظور از دو خط اینا هستن 

var obj = {} ; 
return obj ; 

اینجا کلمه new معنا و مفهومی که توی زبان های دیگه داره رو نداره و با اون ذهنیت بهش نباید نگاه بکنی

و البته ما اینجا از نام obj استفاده کردیم
برای آبجکتمون د راین حالت باید از this بجاش استفاده کنیم یعنی اینجوری میشه 

function createObject(val){
this.key = val ;
}

var obj = new  createObject('something');




یه فیلم آموزشی خیلی خوب هست که قسمت های عجیبش رو توضیح داده

https://downloadly.ir/elearning/vide...e-weird-parts/

دانلود کن ببین خیلی چیزا دستت میاد 

همچنین یه فیلم تو یوتوب هست که توابع و شی گرایی رو توضیح داده


https://www.youtube.com/watch?v=fBpP...dn0c_u&index=1

----------


## cybercoder

به توضیحات plagueعزیز باید این نکات رو اضافه کنم که: ۱- توابع در جاوااسکریپت مقادیرند ۲- کلاس در ES قابل تعریف است ۳- وقتی متدها را زیرمجموعه تابع دیگری می کنید می تواند هم constructor function باشد هم factory function . در نگاه اول فکتوری فانکشن ها و کلاس ها یکسان اند. اما دو تفاوت عمده ( شاید بیشتر هم باشد) که من میشناسم این است که ۱: پرفورمنس کلاس اندکی بیشتر است. ۲- در متدهای کلاس می توان به آسانی از decorator ها استفاده کرد اما در فکتوری فانکشن ها یک مقداری پیچیده هست پیاده کردنش.

موفق باشید.

----------


## plague

> به توضیحات plagueعزیز باید این نکات رو اضافه کنم که: ۱- توابع در جاوااسکریپت مقادیرند ۲- کلاس در ES قابل تعریف است ۳- وقتی متدها را زیرمجموعه تابع دیگری می کنید می تواند هم constructor function باشد هم factory function . در نگاه اول فکتوری فانکشن ها و کلاس ها یکسان اند. اما دو تفاوت عمده ( شاید بیشتر هم باشد) که من میشناسم این است که ۱: پرفورمنس کلاس اندکی بیشتر است. ۲- در متدهای کلاس می توان به آسانی از decorator ها استفاده کرد اما در فکتوری فانکشن ها یک مقداری پیچیده هست پیاده کردنش.
> 
> موفق باشید.


البته شما استاد هستید و من تخصصم js نیست 
ولی فکر میکنم اون کلاسی که تو ES اومده هم یجورایی شورت کات (یا حالا هرچی اسمش رو بشه گزاشت ) باشه و عملا پشت پرده  همون مکانیزم قبل رو داره

----------


## cybercoder

> البته شما استاد هستید و من تخصصم js نیست 
> ولی فکر میکنم اون کلاسی که تو ES اومده هم یجورایی شورت کات (یا حالا هرچی اسمش رو بشه گزاشت ) باشه و عملا پشت پرده  همون مکانیزم قبل رو داره


در مورد ترنسپایلرها نظیر babel فرمایش شما کاملا صحیح هست منتها هم chrome و هم nodejs نسخه های جدید مستقیماْ پشتیبانی می کنند از این feature ها تا حدود زیادی.

----------


## thegoodeveloper

nodejs پیاده سازی زبان JavaScript برای برنامه نویسی Backend هست.

شاید پیچیدگی مساله برای شما در این هست که توابع از نوع object هستند و در عین حال توابع برای ساختن objectهای دیگر هم استفاده می شود.

توابع objectهایی هستند می توانند صدا زده شوند. مانند
foo(str) {
this.name = str      
}

چون foo یک object هست پس می تونیم روی آن property تعریف کنیم:


foo.version = 1.2;
console.log(foo.version)   // 1.2

حالا بیایم و تابع رو صدا بزنیم:
foo('sam')

 

در این صدا زدن this به هر objectای که اشاره کند (می تونه this به هر چیزی در این لحظه اشاره کنه) اون object یک property با اسم name و مقدار ۱.۲ می گیرد و undefined برمی گرداند.

حالا بیایم و این تابع را با keyword new صدا بزنیم:
var f = new foo('sam');

 در این حالت قبل از اجرای کد داخل تابع موتور JavaScript (که در سوال شما nodejs) هست یک object خالی می سازد و آدرس آن را در this نگه می دارد. بعد از این مراحل کد درون تابع اجرا می شود و به آن object خالی property با نام name و مقدار 'sam' داده می شود و در نهایت آدرس آن object برگردانده می شود.

اگر تجربه برنامه نویسی با یک زبان شیی گرا را دارین و می خوایید متوجه شوید در JavaScript چگونه می تونید اون مفاهیم رو پیاده کنید می تونید به لینک JavaScript Class - DashBrace مراجعه کنید.

----------

