
הטקסט המלא של הדקות הראשונות בהרצאה «OOP» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, אנחנו מגיעים לנושא מאוד מעניין בג'אווה סקריפט שנקרא Object Oriented Programming, תכנות מונחי עצמים. מה זה אומר?
ישנן המון שפות בעולם שנחשבות כ-Object Oriented Programming, כלומר שפה שהיא מונחית עצמים. עצם בעצם יכול להיחשב כישות מסוימת שמכילה שני דברים, מאפיינים שמאפיינים אותה ופעילויות שהיא מסוגלת לבצע.
לדוגמה, אם היינו עצם שהיינו רוצים לתאר בתוכנית לדוגמה מכונית, אז מה שהיה בעצם הזה שנקרא מכונית זה שני דברים המאפיינים לדוגמה דגם, יצרן, צבע, מספר גלגלים, משקל, נפח, מנוע, שנת ייצור, כל הדברים האלה הם מאפיינים והם נקבעים על
ידי משתנים והיה לנו פונקציות שקשורות לאותה ישות וזה אומר מה הישות יודעת לעשות. לדוגמה אם זאת הייתה מכונית משחקים אז היא הייתה יכולה לנסוע ימינה, לנסוע שמאלה, ישר, לעצור, למלאות דלק, כל הפעילויות שיש למכונית.
אז JavaScript נחשבת גם כן לשפה Object Oriented מפני שאנחנו מסוגלים לכתוב ב-JavaScript ולבנות אישויות כאלה.
אז אנחנו הולכים לראות מספר שיטות שבעזרתן אנחנו מסוגלים לבנות מעין אישויות או אובייקטים ב-JavaScript. אז בעצם המטרה שלנו בסופו של דבר זה שיהיה לנו איזשהו אובייקט בזיכרון שייצר לנו ישות ואז נוכל להגדיר ממנו הרבה הרבה אישויות כאלה.
לדוגמה אם אנחנו מתעסקים בעובדים אז אנחנו רוצים להגדיר הרבה אובייקטים שכל אובייקט מתאר עובד שיש לו שם פרטי, שם משפחה, תעודת זהות ויש לו את הדברים שהוא יודע לעשות לדוגמה להציג את הפרטים על המסך וכולי.
אז המטרה זה ליצור הרבה אובייקטים כאלה והמטרה לעשות זה כמה שיותר קל. בשפה שהיא Object Oriented טהורה יש לנו משהו שנקרא קלאס.
קלאס מאפשרת להגדיר מה קיים בתוך ישות ולאחר מכן בעזרת הקלאס אנחנו בונים את הישות עצמה שהיא אובייקט בזיכרון ונותנים לאובייקט את המאפיינים השונים בהתאם לערכים הדרושים עבור אותו אובייקט.
בואו נראה איך אנחנו עושים את זה ב-JavaScript בכמה שיטות. בשיטה הראשונה אנחנו לא הולכים ליצור קלאס משלנו אלא אנחנו ישר הולכים ליצור אובייקט.
אז בעצם אני מגדיר כאן איזשהו משתנה, קורא לו car1 ואני מתחיל אותו ב-new object. אז ב-JavaScript יש לי את הישות הזאת שנקראת object שמאפשרת לבנות כבר עכשיו אובייקט אבל אם אני מסתכל מה יש בתוך car1 ואני רואה שאין בו כלום מבחינת מאפיינים, זה הדברים הדיפולטיים שעל חלק מהם אנחנו נדבר.
אבל אני יכול עכשיו ללכת ולהוסיף לו איזשהו מאפיין, לדוגמה מניופקטור. בואו נוסיף לו יצרן, למבורגיני, וכשאני לוחץ נקודה עכשיו אני רואה שהתווסף לו מניופקטור.
עכשיו נוסיף לו מודל. ויש לנו פה מכונית שמתארת את למבורגיני דיאבלו ואנחנו רוצים להוסיף לו עכשיו גם פונקציה. אם נלחץ car1 נקודה אני אקבל כמובן את המניפקטור ואת המודל.
בואו רגע רק נציג אותם. נציג את car1 נקודה מניפקטור ונשרשר אליו את car1 נקודה מודל. בואו נריץ ונראה אם באמת הערכים האלה מוצגים לנו. בואו נסתכל, נראה שבעצם יש לנו למבורגיני דיאבלו וזה הערכים שהכנסנו לcar1.
אוקיי, אם עכשיו הייתי גם מציג משהו שלא קיים. בואו נציג לדוגמה car1.ir כלומר שנת ייצור של המכונית אין לנו שנת ייצור של המכונית בואו נרפרש ונראה שהמשתנה הזה הוא undefined כמובן כי לא הגדרתי אותו בואו ניפטר ממנו ונוסיף עכשיו פעילות עבור המחלקה הזאת יותר נכון האובייקט הזה שנקרא
car1 ואנחנו רוצים להוסיף פעילות של הצגת הפרטים פעילות זאת פונקציה בואו נקרא לה show בדיוק כמו שמקודם הוספתי מודל שלא היה קיים לי והוספנו מניופקטור שלא היה קיים לי, עכשיו אני הולך להוסיף פונקציה שלא קיימת לי.
את זה ראינו כשעבדנו על ג'ייסון, איך אנחנו מוסיפים פונקציות בצורה כזאת, והשיטה זה פשוט לרשום פונקציית inline function ולבנות אותה. בואו נעשה alert, והשאלה עכשיו זה איזה פרטים אני מציג.
עכשיו זאת שאלה מאוד מעניינת, כי מה בדיוק אני אמור להציג? אני אמור להציג מניופקטור? הרי מייפקטור שייך ל-car1, למי בדיוק אני אמור, איך אני אמור בדיוק להציג את הערכים האלה של הפונקציה?
אז מה שאנחנו צריכים לעשות, אנחנו צריכים להבין שמי שהולך לקרוא לפונקציה הזאת זה אובייקט מטיפוס car1. car1 הולך לקרוא לפונקציה. אוקיי, אז אם car1 הולך לקרוא לפונקציה הזאת, אנחנו רוצים בעצם להציג את הפרטים של car1, אבל אני לא רוצה פה לכתוב car1, אני יכול, אבל זה לא יהיה כל כך חכם.
יש לנו מילה שמתייחסת לאובייקט הנוכחי שאנחנו מדברים עליו וזה האובייקט שקורא לפונקציה הנוכחית. עכשיו אם נסתכל כאן נראה שcar1 זהו האובייקט שקיים לי בזיכרון שמפעיל את הפונקציה show ואז הפונקציה show מופעלת כרגע על ידי car1 אז יש לנו מילה שנקראת this וthis מתייחסת לאובייקט שקרא לפונקציה ובמקרה הזה זה car1.
ועכשיו אנחנו יכולים לרשום דיס נקודה וכבר אנחנו רואים שהגענו למניפקטור ודיס נקודה מביא אותנו גם למודל. זאת אומרת שאנחנו יכולים עכשיו לקרוא לכר אחד נקודה show בואו אפילו נציג כאן את הדבר הבא מניפקטור נקודותיים נשרשר אותו עם היצרן ומודל נקודותיים נשרשר אותו עם הדגם.
אוקיי בואו נריץ את זה ונראה שקריאה לפונקציית show מציגה לי את הפרטים. הנה המאניופקטור למבורגיני מודל דיאבלו אוקיי אז אנחנו בעצם היינו צריכים לכתוב די הרבה קוד בשביל לבנות אובייקט אחד אבל אם אני רוצה לבנות עוד אובייקט הרי אין לי מכונית אחת באפליקציה יש לי כל מיני מכוניות אז בשיטה
הזאת זה לא שיטה כל כך חכמה ולא תהיה לי ברירה אלא פשוט לשכפל את הכל שוב פעם לcar2 אם אני רוצה אובייקט שני ושוב פעם להגדיר מאניופקטור שוב פעם להגדיר מודל ושוב פעם להגדיר עבור car2 פונקציית show בגלל שיש לי פה דיס ולא ניגשתי לכר אחד אז אני יכול
להשאיר את הפונקציה הזאת כמו שהיא מפני שהפעם דיס יתייחס לכר 2. בואו נחליף את הערכים יש לנו פה פרארי יש לנו מודל ספיידר ואנחנו עכשיו רוצים לגשת לכר 2 נקודה show.
בואו נרפרש אז יש לנו פה את כר 1 של למבורגיני דיאבלו וכר 2 הציגנו פרארי ספיידר. בעצם הצלחנו להגדיר שני אובייקטים שונים כל פעם היינו צריכים מחדש ללכת ולכתוב אותם אם לא הייתי עושה קופי פייסט הייתי צריך לכתוב את המניפקטור בעצמי ויכלתי כמובן לטעות כאן ואז בעצם היה לי פה קצת טעויות מבחינת האובייקטים או המשתנים יותר נכון
הפרופרטיז שקיימים בתוך האובייקטים וזה לא כל כך דבר שהוא טוב לבצע ולכן השיטה הזאת שבה הגדרנו אובייקטים בצורה כזאת היא מה שנקרא לא reusable כלומר היא לא חוזרת על עצמה בצורה פשוטה הייתי צריך כל פעם לכתוב את הכל מחדש.
אז בואו נראה שיטה אחרת שבעזרתה אני יכול לכתוב אובייקטים אבל גם בשיטה השנייה שאנחנו הולכים לראות אנחנו הולכים לראות משהו שהוא דומה לזה בשיטה קצת אחרת. אז יש לנו פה Object Oriented with Json הכנתי לעצמי פה כל מיני דוגמאות ריקות שאנחנו הולכים למלא אותן.
אז בעצם Object Oriented with JSON אומר שאני יכול לבצע דברים דומים אבל אני יכול לעשות אותם בתחביר של JSON. אז בואו בעצם נראה איך אפשר לעשות את זה.
ואם הייתי רוצה לבצע את אותו הדבר פחות או יותר הייתי רוצה שיהיה לי איזשהו אובייקט מכונית שיכיל לי דגם ויצרן אבל הייתי רוצה לעשות אותו בתחביר של JSON אז הייתי צריך בעצם לבנות אובייקט car1 שווה ואז להגדיר אובייקט בתחביר מניופקטור נקודותיים ויש לנו את למבורגיני יש לנו אחר כך פסיק ואז יש לנו מודל נקודותיים
ואז יש לנו את הדגם ואם היינו רוצים גם פונקציה אז כאן הייתי יכול גם לכתוב show נקודותיים ואותו תחביר של הפונקציה פונקשן פתיחת סוגריים לסוגסלות כתיבת התוכן של הפונקציה שוב פעם עם דיס נקודה מניופקטור יש לנו שרשור של דיס נקודה מודל והאלרט ואז אני סוגר את הבנייה של כל
האובייקט עם נקודה פסיק. פה יצרתי car1 בואו ניצור car2 ניקח את אותו הדגם כמו מקודם, פרארי ספיידר car1 נקודה show car2 נקודה show בואו נבגור את הדפדפן הזה ונריץ את הדוגמה הזאתי.
ואנחנו רואים למבורגיני דיאבלו ואנחנו רואים את פרארי ספיידר בעצם הצלחנו להשיג את אותו הדבר כמו מקודם אבל בתחביר קצת יותר מקוצר אבל החיסרון של שני המקרים האלה של שימוש באובג'קט בצורה כזאת או שימוש בתחביר של ג'ייסון עבור אובג'קט אוריינטד זה שהייתי צריך כל פעם להגדיר מחדש את האובייקט ואיזה מאפיינים יש לו ואיזה פונקציות יש
לו וזה לא באמת אובג'קט אוריינטד אובג'קט אוריינטד אני אמור להגדיר את זה פעם אחת במשהו שהוא מעין קלאס או מחלקה או איזושהי קטגוריה מסוימת, ואחר כך אני לא צריך להגדיר את זה עוד פעם אלא אני רק יוצר אובייקטים, כלומר מופעים בזיכרון מהישות הזאת.
לפני שנעבור ונראה איך עושים את זה, בואו נראה איך אני יכול להציג את הפרמטרים של אובייקט. כלומר בואו נסתכל רגע על האובייקט car1. לאובייקט car1 יש לי מניופקטור ויש לי מודל ויש לי פונקציית show.
אנחנו יכולים לרוץ ולהציג את הערכים השונים. אז ישנה לולאה שנקראת for-in. for-in לולאה ב-JavaScript זה בעצם לולאה שרצה על איזשהו משתנה, בואו נקרא לזה prop, כי הוא מתאר לי פרופרטי, ובתוך איזשהו אובייקט, בואו ניקח את car1.
עכשיו הפרופרטי הזה הופך להיות כל אחד מהשמות של המאפיינים. בואו רגע נכבה את השואוים הקודמים, נסגור את הדפדפן הזה, נריץ מחדש את המופע של הדפדפן הקודם בכדי לראות את השמות של המאפיינים.
אז יש לנו פה את המניופקטור שזה שם של מאפיין ראשון ויש לנו את המודל שזה שם של מאפיין שני. ויש לנו כמובן גם את פונקציית show שזאת פונקציה שקיימת לנו.
אוקיי, אז בעצם לולאת for in מסוגלת לרוץ על הפרטים של האובייקט או המאפיינים והפונקציות שלו, הפרופרטי שרץ לי בתוך האובייקט נותן לי את השם של המאפיין.
אז איך אני יכול להגיע לערך של המאפיין? בואו נשרשר אותו עם car1 ואופרטור הסוגריים המרובעים מאפשר לי להגיע לפרופרטי בצורה כזאת. כלומר אם יש לי שם של אובייקט שנמצא לי בזיכרון, אני יכול לפתוח סוגריים מרובעים ולתת לו פה את השם של המאפיין שאני רוצה להגיע אליו וJavaScript תחזיר לי את הערך שלו.
זאת אומרת שהעלולה הזאת היא פשוט מאוד מציגה לי את הערכים השונים. אז עבור מניפקטור אני רואה שהערך שלו הוא למבורגיני, עבור car1 כמובן, עבור מודל הערך שלו זה דיאבלו ועבור פונקציית show הערך שלה וכל התחביר של הפונקציה function alert בלה בלה בלה בלה.
בעצם ככה יכולנו לרוץ על אובייקט ולהציג את כל המאפיינים, את כל מה שיש בתוכו בעצם. הדבר הזה היה עובד גם בטכניקה של ג'ייסון. בואו נכבה את שני אלה, נסגור את הדפדפן, נריץ אותו מחדש.
בעצם הטכניקה הזאת עובדת על כל אובייקט, זה לא משנה איך האובייקט נוצר, יש לי מניופקטור למבורגיני, יש לי מודל דיאבלו ויש לי פונקציית show שזה התחביר שלה במקרה הזה.