תכנות מונחה עצמים - המשתנה this
פרדיגמת התכנות הנצופה והמבוקשת ביותר כיום היא תכנות מונחת עצמים (אובייקטים של מחלקות שונות).
בשונה מתכנות אימפרטיבי (סקריפט המריץ פקודה אחר פקודה לפי סדר הכתיבה)
או מתכנות פרוצדורלי (המשתמש בפונקציות הקוראים אחד לשני).
הסדר בכל מחלקה והאפשרות לתקן ולעשות שינויים בלי לפגוע בשאר הקוד,
זה מה שגורם שכשבונים תוכנה רצינית רצוי שזה יבנה מונחה עצמים.
בנושא זה ישנם מושגים רבים וחשובים שלא נתייחס כעת אליהם:
כימוס, ירושה, פולימורפיזם, בנאי, העמסה, דריסה, מדד צימוד, לכידות ועוד...
הנושא בו יעסוק מאמר זה הוא במשתנה המצביע על האובייקט הנוכחי (הנקרא בשם this).
לשם כך קודם יש להבין את ההבדל בין אובייקט (מופע) למחלקה.
מחלקה היא תבנית ליצירת אובייקטים (כמו שבלונה), היא מבנה של תוכנית שמתארת עצם כלשהו,
אשר יש לו תכונות (משתנים) והתנהגויות (שיטות).
למשל: מכונית חדשה שעדיין לא נכנסה לייצור, אשר יש לה מאפייניים שהם:
צבע: אדום.
שוקלת: טון.
וכן יש לה פעולות התנהגות שהם:
נסיעה: לפני שמתחילה לנסוע בודקת שכולם חגורים ושהמשקל שעליה מותר.
דלק: מידי שעה בודקת אם יש מספיק דלק ואם חסר היא בודקת איזה תחנת דלק הכי זולה באיזור.
עכשיו עדיין היא לא מיוצרת, היא דגם של מכונית.
אפשר עדיין להחליט שהיא תתנהג בצורה שונה או לשנות אותה בשביל שהמשקל שלה יעלה או ירד.
אבל כשיתחילו להיווצר ממנה מכוניות וישווקו לשוק, זה כבר לא יכול להשתנות. הם נבנו כפי שהמחלקה הייתה.
אם אני בכל זאת משנה מכונית מסויימת, זה לא משפיע על שאר המכוניות, כי זה אובייקטים שונים.
![](https://static.wixstatic.com/media/42473ba71c275d8942666d188f31daad.jpg/v1/fill/w_980,h_755,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/42473ba71c275d8942666d188f31daad.jpg)
מה זה אומר לנו?
המחלקה היא אחת וממנה יכולים להיווצר הרבה אובייקטים דומים.
כל אובייקט הוא שכפול של אותה מחלקה ונבנה עם אותם ערכים כברירת מחדל.
כשאני משנה את ערך של המשקל (שהוא אחד המשתנים של המחלקה מכונית),
אני משנה רק את הערך של האובייקט המסויים הזה.
בשונה מהעולם האמיתי, בתכנות ניתן לפעמים להשתמש במשתנה או בשיטה של המחלקה עצמה.
כמובן המחלקה היא אחת, ולכן משתנה של המחלקה (מה שנקרא משתנה סטטי - static) הערך שלו שווה בכל האובייקטים. לדוגמה: נקבע שלכל מכונית יהיה משתנה וירטואלי המחזיק ערך הגודל באחד בכל פעם שמיוצרת עוד אובייקט של מכונית מדגם זה. משתנה כזה הוא רק אחד כללי לכל האובייקטים - המכוניות.
הערך הזה לא שייך למכונית מסויימת, הוא שייך לדגם עצמו (למחלקה עצמה), שלדגם יש כך וכך מכוניות שיוצרו ממנו.
נקח מקרה שיש מחלקה בשם: car, שיש לה משתנה סטטי בשם count וממנה נוצרה מכונית בשם: car1.
לכן כשנקרא למשתנה הסטטי הזה מחוץ למחלקה,
במקום לכתוב לדוגמה: car1.count, יש לכתוב: car.count. כי זה שייך למחלקה.
כך כשפונים למשתנה רגיל בתוך מחלקה,
לא צריך לקרוא לו: car.color,' יש לקרוא לו: this.color.
כי זה שייך למחלקה שבתוכה אנחנו כותבים כרגע.
בשפת ג'אווה וכך ברוב השפות משתנה בתוך המחלקה נקרא this.
(בשפת סוויפט של אפל, הוא נקרא self. אך הרעיון הוא אותו רעיון)
הדבר הבאמת מעניין הוא השימוש בשם זה בשפת ג'אווה סקריפט,
בה עדיין אין ממש מחלקות אלא פונקציות.
והמחלקה הכוללת משתנים ופונקציות היא בעצם גם כן סוג של פונקציה.
1. כשנעשית פניה למשתנה בתוך פונקציה, זה רפרנס לפונקציה.
2. כשנעשית פניה מחוץ לפונקציה, זה רפרנס לאובייקט החלון (window).
3. בתוך טיפול באירוע, מייצג את האלמנט שמטפל באירוע (למשל: כפתור היעד עליו יתבצע אירוע לחיצה).