בפעם האחרונה, למדנו איך ליצור טיפוס אובייקט כדי לייצג את שני האובייקטים דמויי-ווינסטון שלנו
ואז לאתחל אותם עם בנאי (constructor).
טיפוס אובייקט לא חייב להיות מקושר רק עם מאפיינים.
הוא יכול להיות מקושר גם עם פונקציונליות. תחשבו על העולם וכל טיפוסי האובייקטים בעולם
כמונו, בני האדם. לכולנו יש גובה וגיל, אבל יש לנו גם דברים שאנחנו יכולים לעשות, כמו לישון, לאכול, ולתכנת.
ואנחנו רוצים להיות מסוגלים לקשר את הפונקציות האלו עם טיפוסי האובייקטים האלו.
בתוכנית הזאת, שהיא בדיוק כמו שהשארנו אותה בפעם שעברה, יש לנו את הפונקציה
drawWinston, שאנחנו יכולים לקרוא לה עם שני אובייקטי ווינסטון. אבל זה היה יותר נחמד אם היינו יכולים פשוט לחבר
את זה לטיפוס של אובייקט ווינסטון. אנחנו יכולים, וזה די קל לעשות זאת.
אז מתחת לבנאי, אנחנו נכתוב Winston - עם אות W גדולה - נקודה prototype,
אב הטיפוס (prototype), זאת מילה חדשה שכנראה לא ראיתם קודם.
אב הטיפוס הוא מאפיין של האובייקט שאנחנו יכולים לצרף לו פונקציות
וזה אומר שלכל אובייקט שהוא מופע של הטיפוס יהיו את הפונקציות האלו.
אז נוכל לרשום נקודה, prototype, ואז נקודה, ואז את שם הפונקציה, draw
ונרשום שווה, ואז נוכל לקחת את הקוד של פונקציית הציור שלנו ולשים אותו
כאן. אז מה שעשינו עכשיו, זה לחבר את פונקציית הציור
לאב הטיפוס של ווינסטון. וזה אומר שאנחנו אמורים להיות מסוגלים לקרוא ל-draw על כל אובייקט מסוג ווינסטון.
אז זה יהיה אפשרי לקרוא ל-draw על האובייקטים winstonTeen ו-winstonAdult.
וכשיש לנו פונקציה כזאת, שאנו יכולים לקרוא לה על אובייקט
אנו קוראים לזה "מתודה", אז מעתה אשתמש גם במילה "מתודה".
אז נאמר שזו "מתודת הציור". אוקיי.
אז עכשיו נמחק את כל זה, ונראה אם אנחנו יכולים לקרוא ל-draw?
winstonTeen.draw()
אוקיי. יש לנו שגיאה, ראינו אותה קופצת כאן, וכתוב: "winstObject is not defined" (האובייקט winstObject לא מוגדר).
אוקיי. קודם, היינו מעבירים את הפרמטר הזה, האובייקט ווינסטון, לפונקציה drawWinston
אבל עכשיו אנחנו לא מעבירים אותו יותר. אז אנחנו יכולים להעביר אותו
ומה אנחנו אמורים להעביר פה? נרצה להעביר את winstonTeen. אוקיי.
זה עבד, אבל זה גם נראה ממש טיפשי. אני כבר קוראת לפונקצית draw על האובייקט עצמו.
לא הגיוני שאצטרך להעביר את האובייקט כפרמטר בנוסף, זה נראה מיותר
זה נכון, אנחנו לא צריכים לעשות את זה, אז בואו נמחק את זה, ונחשוב רגע.
אם אנחנו בתוך האובייקט, במה נוכל להשתמש כדי לגשת למאפיינים של האובייקט?
אם תסתכלו על הבנאי (constructor) שלנו, תיזכרו במילה המיוחדת this
מה אם פשוט נשנה את מה שכתוב כאן, ל-"this"! נחליף את winstObject ב-this.
כי עכשיו אנחנו בתוך האובייקט. הפונקציה הזאת מופעלת
על האובייקט, כך ש-this יתייחס לאובייקט הנוכחי.
אז אנו יכולים פשוט לרשום this ולגשת לכל המאפיינים של האובייקט הנוכחי.
וזה עובד, רואים?
אנחנו כותבים winstonAdult.draw()
טה-דה! זה ניגש למאפיינים של winstonAdult כי זה האובייקט שעליו קוראים לפונקציה
זה מה שממש מגניב במילה this, אפילו שזה יכול להיות קצת מבלבל לפעמים.
אוקיי, זה היה ממש כיף, אז בואו נוסיף עוד מתודה. מה עוד אפשר שווינסטון יעשה?
אולי נגרום לו לדבר. ניצור את Winston.prototype.talk. אנחנו יכולים לחבר כמה מתודות שנרצה לאב הטיפוס.
נכתוב: "I'm Winston!" (אני ווינסטון)
ואז נרשום כאן this.x+20 ו-this.y+150.
וכמובן, לא קרה שום דבר, כי לא קראנו עדיין לפונקיה הזו.
אז בואו נגרום לו לדבר. winstonTeen.talk()
והופיעו המילים "אני ווינסטון"! ואם נקרא גם ל-winstonAdult.talk()
טה-דה! אוקיי, עכשיו יש לנו טיפוס אובייקט Winston שיש לו מאפיינים: כינוי, גיל, מיקום X, מיקום Y
ויש לו גם פונקציונליות - התנהגויות, מתודות - שמתנהגות בצורה שונה בתלות במאפיינים
ואנחנו יכולים ליצור כמה מופעים שנרצה של Winston ולקרוא לכל המתודות האלו.
מגניב, לא?