https://themohsen.me || Front-End @ Yasna.team
بررسی نحوهی کارکرد this در Class های جاوا اسکریپت
اگه مطلب قبلی که درباره class در جاوا اسکریپت بود رو خونده باشین،تا حدی با مفهومش آشنا هستین
اگرم نخوندین که بنظرم قبل از ادامه دادن این مطلب، برید سراغش و بعدش بیاید اینجا.
اگه یادتون باشه، گفتیم که تعریف کلاس به چه صورتی هستش و آبجکت هاش چطوری ساخته میشن
حالا
بحثی که اینجا وجود داره ، استفاده از this هستش و چیزی که داره بهش اشاره میکنه.
بیاید این مثال رو باهم بررسی کنیم:
توی مثال بالا، یک کلاس به اسم StaticMethodCall ساختیم و برای constructor داخلش هم دوتا دستور گذاشتیم که قرار هست برامون متد ()StaticMethod رو اجرا کنن و خروجیش رو نمایش بدن. ( البته به عنوان پیش زمینه ذهنیتون، یه توضیح بدم => متدهایی که نوعشون static تعریف میشه، مستقیم با اسم کلاس فراخوانی میشن. ینی نمیتونیم با آبجکتی که از روی کلاس میسازیم صداشون بزنیم. بنظرم برای درک بیشتر این بحث برید و داکیومنت MDN رو دربارهاش بخونید.)
حالا با توجه به چیزایی که گفتم، بنظرتون خروجی این کد چی میشه؟
اگه ما یه مدل از روی کلاسمون بسازیم و " constructor "ای که براش تعریف کردیم اجرا بشه، چه نتیجهای رو برامون چاپ میکنه؟! خطا داریم یا همه چی درست اجرا میشه و ما یه آبجکت سالم برامون ساخته میشه؟! بنظرم برگردین و یه بار دیگه کدش رو نگاه کنید :)
اگه این کد رو بنویسید و اجراش کنید، میبینید که مدلِ ما بدون ایراد ساخته میشه و عبارت 'static method has been called.' دوبار چاپ میشه، اونم بدون هیچ ایرادی..!
اما چطوری؟!
اگه به تعریف مفهوم class توی JS توجه کرده باشین،حتما یادتون میاد که دربارهاش اینطوری گفتیم:
چیزی که ما ازش به عنوان کلاس نام میبریم،یک نوع فانکشن مخصوصه با خصوصیات یک class. ینی بعد از تعریف کردنش، اون فانکشن مخصوص اجرا میشه و برای ما، یک آبجکت میسازه با همون Prototype های مورد انتظار و موجود در کلاس.
پس با این حساب میتونیم بگیم که
ما با یه فانکشن طرفیم که بعد از هربار صدا زدن Class داره اجرا میشه.
و این دقیقا چیزیه که ما از تعریف Class انتظار داریم، درسته؟
خب! پس مشخصا عبارت ()this.constructor داره به همین فانکشن اشاره میکنه و دقیقا کلاس ماست.
به عبارت دیگه، وقتی داریم متد ()StaticMethod رو صدا میزنیم، و بجای اسم کلاسمون، عبارت ()this.constructor رو مینویسیم، دقیقا داریم کلاس رو صدا میزنیم و ()this.constructor برابر هست با خودِ کلاس.
بنظرم برای اینکه این مطلب خوب جا بیفته، بیاید همین عبارتِ ()this.constructor رو توی کنسول چاپ کنیم تا ببینیم خروجیمون چی میشه.( بنظرم خودتون هم این کار رو انجام بدین تا متوجه اتفاقی که داره میفته بشین )
اگه دقت کنید، توی تعریف constructor، تنها دستوری که گذاشتم، چاپ کردن عبارت this.constructor هست و بعد از class هم یه مدل ازش میسازم تا ببینم چه خروجیای رو بهمون نشون میده.
و همونطور که میبینید، چیزی که گفتم داره اتفاق میفته و به ازای دستورِ
console.log(this.constructor);
دقیقا کلاسِ تعریف شدهی ماست که داره توی کنسول چاپ میشه.
امیدوارم توضیحاتم مفید بود باشه و خوشحال میشم اگه سوالی براتون ایجاد شد، نظری داشتین یا خواستین دربارهاش بیشتر صحبت کنیم بهم پیام بدین ?✌
مطلبی دیگر از این انتشارات
برنامه نویسی چیست و چگونه آن را شروع کنیم؟
مطلبی دیگر از این انتشارات
تدریس خصوصی برنامه نویسی وب
مطلبی دیگر از این انتشارات
انواع برنامهنویسی