Mohammad Bohluli
Mohammad Bohluli
خواندن ۲ دقیقه·۵ ماه پیش

شی گرایی قسمت پنجم (Object.create)

رسیدیم به نوع سوم ساخت شی یعنی ()Object.create

اگه تا الان مقاله های قبل رو نخونید از این لینک شروع کنید به خوندن

خب بریم سر اصل مطلب، اگه دقیت کرده باشید توی دو روش قبلی ما به چیزایی مثل تابع constructor و کلمه کلیدی یا همون اپراتور new نیاز داشتیم تا یه شی بسازیم یا مثلا یک متد رو دستی به پروتوتایپ اضافه کنیم

خبر خوب اینکه دیگه با Object.create نیازی به اینا نداری :) برو حالشه ببر

پس چطور باید بسازیم ؟مثال زیر رو ببین

اول میاییم یه آبجکت به عنوان پروتوتایپ میسازیم و هر متد یا پراپرتی که نیازه داریم رو توش تعریف میکنیم مثلا اینجا ما calcAge رو نوشتیم

توی مرحله بعد فقط کافیه هر آبجکتی که دوست داشتیم بسازیم و از این پروتوتایپ استفاده کنه رو به Object.create پاس میدیم، تموم شد رفت به همین راحتی دیگه نه با تابع constructor نه new نه prototype هیچی درگیری نشدیم و خیلی تمیز شد

در واقع الان PersonProto نقش همون پروتوتایپ مارو بازی میکنه یه کنسول بگیری از آبجکت ali میبنیی که متد calcAge توی پروتوتایپش هست بدون اینکه اینطوری بنویسیمش Person.prototype.calcAge

اما چی شد که اینطوری شد ؟؟؟(دیاگرام زیر رو ببین تا برات توضیحش بدم)

توی دو مورد قبلی (ES6 و constructor function) ما وقتی از اپراتور new استفاده میکردیم میومد اتوماتیک _ _proto _ _ رو میساخت و اضافش میکرد(سمت چپ نمودار)

اما توی ()Object.create ما اومدیم دستی پروتوتایپ یک ابجکت رو دستی اضافه کردیم

اینجا ما به صورت دستی PersonProto رو از طریق Object.create وصل کردیم به __Person.__proto و ارث بری پروتوتایپ و prototype chain دقیقا مثل همون دوتای قبلی هست و فرق مهمش اینه که اینجا دیگه چیزی به اسم تابع سازنده نداریم و همچنین prototype property هم نداریم

پس همون طور که بالاتر گفتم وقتی از Object.create استفاده میکنی دیگه نیاز نیست متد تو به Person.prototype.mymethod اضافه کنی بلکه کافیه به همون PersonProto اضاف کنی خودش اتوماتیک همه چیو برات ردیف میکنه (بعد هی بگید جی اس بده :) )

اگه از __ali.__proto یه دونه لاگ بگیری میبینی که متد calcAge بدون اینکه ما چیزی به پروتوتایپ اضافه کنیم اضافه شده پس یعنی __ali.__proto برابر است با PersonProto

خب حالا یه سوال ، وقتی constructor نداریم پس چطور میتونیم وقتی یه آبجکت میسازیم مقدار دهی کنیم ؟باید بگم که بنا به نیاز میتونیم تابع constructor هم براش بسازیم و اسم دلخواهی بهش بدیم مثلا init

دقت کنید که اصلا شبیه اون تابع constructor نیست شاید ظاهرا فکر کنید همون کارو میکنه ولی کارایی اون رو نداره مثلا تابع constructor خود به خود صدا زده میشه ولی اینجا ما باید خودمون صداش بزنیم
در واقع تابع constructor شبیه سازی کردیم
دقیقا مثل مثال زیر


خب اینم از آخرین نوع ساخت شی توی جاواسکریپت

توی مقاله بعدی ارث بری رو توی هر سه نوع حالت، کامل بررسی میکنیم

امیدوارم بدردت خورده باشه❤️

کانال تلگرامم 👈 LeanByLearn@

پروتوتایپجاواسکریپتobject oriented programming
علاقمند به تکونولوژی و هرچی که بهش مربوطه، کانال تلگرام LearnByLearn@
شاید از این پست‌ها خوشتان بیاید