جاوا اسکریپت نسخه جدید ES6 – شی گرایی در ES6 – قسمت دوم

جاوا اسکریپت نسخه جدید ES6 – شی گرایی در ES6 – قسمت دوم

توی قسمت قبل یاد گرفتیم چگونه یک class ایجاد کنیم و متد ها و خصوصیات ها را هم ایجاد کردیم و یاد گرفتیم چجوری بتونیم متد های static ایجاد کنیم همچنین فهمیدیم که میتونیم متد سازنده هم توی ES6 ایجاد کنیم چه قابلیت خوبی 😀

توی این قسمت با قابلیت یکم پیشرفته توی شی گرایی ES6 آشنا بشیم.

وراثت:

خب اول بدونیم که وراثت ینی چی؟! تعریفش رو از ویکی پدیا نقل میکنیم

وراثت یا ارث بری (Inheritance) از مفاهیم اساسی برنامه نویسی شیءگراست. هر شیء یک نمونه از یک کلاس است و هر کلاس می‌تواند از کلاس یا کلاسهای دیگری مشتق شده باشد (خواص متدها یا رویدادهای کلاس‌های دیگر را به ارث ببرد). در یک مثال ساده می‌توان اتومبیلی را در نظر گرفت که برای جلوگیری از بازنویسی خواص عمومی اتومبیل شامل: چهار چرخ، متدهای حرکت چرخ، متد چرخاندن فرمان، فرمان، بدنه، در و غیره، می‌توان یک کلاس پایه از اتومبیل ایجاد کرد سپس مثلاً برای اتومبیل سیتروئن مدل C۵ یک کلاس جدید ایجاد کرده که خواص، متدها و رویدادهای عمومی اتومبیل را داشته باشد و فقط برای خواص، متدها و رویدادهای جدید این اتومبیل کد نوشته شود. این ویژگی باعث صرفه‌جویی در نوشتن کد و تا حدودی تضمین صحت کد موجود می‌شود. به عنوان مثال اگر کلاس پایه مشکلی داشته باشد فقط کافی است کلاس پایه تغییر داده شود و در تمامی کلاس‌هایی که از این کلاس پایه ویژگی‌ای ا به ارث برده‌اند این تغییر اعمال خواهد شد.

خب طبق تعریف بالا پس اول باید یک کلاس والد  (Parent Class)، کلاسی که در قسمت قبل برای مدیریت افراد به نام Person نوشتیم رو میخواهیم گسترش بدیم و روی همون کار کنیم کلاس مرحله قبل به صورت زیر است.

خب کلاس بالا در متد سازنده نام و نام خانوادگی را میگیرد و در متد getInfo اطلاعات را برمی گرداند و در متد calcSal که یک متد استاتیک است حقوق را محاسبه میکند. خب حالا میخواهیم یک کلاس بسازیم با نام Manager که فرزند Person است.

به قطعه کد بالا میبینید که به راحتی با کلمه کلیدی extends و سپس نام کلاس والد بعد از آن یک کلاس را فرزند کلاس دیگری میکنیم.
چند نکته در رابطه با کلاس های فرزند:

  1. کلاس های فرزند به تنهایی اجرا میشوند و نیازی نیست قبل از Instance گرفتن از کلاس های فرزند از کلاس والد Instance گرفته شود.
  2. کلاس های فرزند خود متد سازنده دارند ولی حتما باید در متد سازنده فرزند متد سازنده والد صدا زده شود و Set شود.
  3. تمام متد های کلاس والد در کلاس فرزند وجود دارند ولی متد های کلاس فرزند در کلاس والد وجود ندارد. یعنی اگر getInfo را در Manager صدا بزنیم اجرا میشود ولی اگر متدی در Manager وجود دارد را در Person صدا بزنیم اجرا نمیشود.
  4. مفهوم Override ینی یک متد که در کلاس والد وجود دارد را بازنویسی کنیم

خب حالا میخواهیم متد calcSal را در manager بازنویسی کنیم. اصلا کار سختی نیست متد با همان نام در Manager ایجاد میکنیم

خب حال به توضیح کد بالا میپردازیم در کد بالا ابتدا متد سازنده کلاس را ساختیم که سه پارامتر نام و نام خانوادگی و ضریب را میگیرد و توسط super متد سازنده والد را اجرا میکند و نام و نام خانوادگی را به آن ارسال میکند و factor را در factor کلاس Manager تنظیم میکند.

سپس متد calcSal را ساختیم و چون همنام با متدی است در کلاس والد یعنی آن را بازنویسی میکند. در این متد توسط super.calcSal از کلاس والد را اجرا کردیم و مقدار بازگشت داده شده توسط آن را در متغیری ذخیره کردیم و سپس مقدار ذخیره شده توسط آن متغیر را ضرب در factor کردیم و return دادیم.

پس در قطعه کد بالا موارد زیر را فهمیدیم.

  • برای بازنویسی متد ها، متدی همنام با آن در کلاس فرزند ایجاد میکنیم.
  • برای ساخت سازنده حتما و حتما سازنده متد والد در کلاس فرزند توسط ()super اجرا کنید.
  • برای دستیابی به متد ها و متغیر های کلاس والد از super استفاده میکنیم برای مثال: ()super.methoName و super.variableName

متد های دستیابی:

متد هایی هستند که برای دستیابی به متغیر های داخل کلاس استفاده میشوند و هدف این متد ها این است که متغیر های داخل کلاس به صورت مستقیم قابل دسترسی و تغییر نباشند.

 

متد های setter: متد هایی هستند که برای وقتی به کار می روند که نگذاریم مستقیما متغیری تغییر داده شود. عموما برای Validation یا Default Value ها مورد استفاده قرار میگیرند.

متد های getter: متد هایی هستند که برای وقتی به مار میروند که نگذاریم مستقیما متغیری دستیابی شود. عموما برای پیش وند یا پسوند گذاشتن یا اتصال به موارد دیگر یا … استفاده می شوند.

 

برای مثال میخواهیم متد های دستیابی برای متغیر name بسازیم.  با گذاشتن یکی از کلمات کلیدی set و یا get در پشت نام خصوصیت مورد نظر میتوانیم یک متد دستیابی بسازیم.

در صورتی که از set استفاده کنید تابع ساخته شده یک آرگومان دارد که مقدار وارد شده برای آن خصوصیت است.

برای مثال در زیر برای name آرگومان را با chanedName وارد کردیم و مقدار وارد شده در تابع با این اسم قابل دسترسی است.

 

 

دیدیم که ابتدا name را _name تغییر دادیم و سپس متد های set و get را برای name ساختیم که این ها با تغییرات name_ را میگیرند و تحت عنوان name و پس میدهند.

 

ببخشید اگه این قسمت از سری آموزش ها دیر شد.

توی قسمت بعدی در مورد کار با رشته ها یا همون String ها صجبت میکنیم و میفهمیم چقدر کار کردن با رشته های توی ES6 راحت تر شده و چقدر متد های باحال داریم برای کار با رشته و چه روش ها نوین تری داریم.

  • بسیار هم عالی …
    اینجور که بوش میاد شی‌گرایی تو ES6 درست درمون و تر و تمیز شده.
    آموزش هات برای من مفیدن، چون به مسائل پایه‌ای میپردازن، درضمن مختصر و مفید هستند و وقت میکنم که مطالعه‌شون کنم.
    امیدوارم آموزش بعدی رو زودتر آپ کنی 😀

    • حمید فرجی

      بله بسیارعالی تر شد…
      چشم حتما زودتر مینویسم..

  • Arash Khazaei

    متد های getter: متد هایی هستند که برای وقتی به مار میروند که نگذاریم …..