
person.js, בתחביר class של ECMAScript 6.constructor(firstName, lastName) שומר את הערכים ב-this.firstName וב-this.lastName. לפי הדובר, התחביר הזה הוא עטיפה נוחה לפונקציית constructor רגילה ב-JavaScript.module.exports = Person.const Person = require('./person'). שמות מחלקות נכתבים באות גדולה, כדי שמי שקורא את הקוד יבין שזו מחלקה ולא פונקציה.new Person(...), ואז קריאה ל-display.this._age. ב-JavaScript אין שדות פרטיים בתחביר הזה, ולכן הקו התחתון מסמן שאין לגעת בשדה מבחוץ.set age(value) בודק שהערך מספרי וחיובי (בעזרת isFinite). אם לא, הוא זורק Error. רק ערך תקין נכנס לשדה.get age() מחזיר את הערך השמור.Object.defineProperty או closures. לפי הדובר, אלה פחות נוחות לשימוש, ו-_age עדיין נגיש מבחוץ בשיטה שמוצגת.הטקסט המלא של הדקות הראשונות בהרצאה «תכנות מונחה עצמים ב-NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים ליישום Object Oriented Programming ב-Node.js. כלומר, אנחנו הולכים לראות עכשיו בנושא הזה איך בעצם אנחנו מפתחים Object Oriented ב-Node.js.
עכשיו, חשוב להבין, המטרה של הנושא זה לא ללמד Object Oriented מההתחלה, זאת אומרת שאם אתם לא יודעים Object Oriented, אז נכון יהיה או לעבור ממש ברבחוף על הנושא ולנסות לתפוס משהו, יותר נכון יהיה פשוט לעזוב רגע את הנושא ללכת להבין באמת מה זה Object Oriented על ידי קורס
או מודול נפרד ואז לחזור לזה או פשוט לדלג על הנושא הזה כי אנחנו לא הולכים ללמוד פה מההתחלה אלא רק לראות איך אנחנו מיישמים את כל האלמנטים של Object Oriented ב-Node.js אז דבר ראשון מה שאנחנו רוצים לעשות זה Incapsulation כלומר איך אנחנו בונים מחלקה ואיך אנחנו משתמשים בה אנחנו נבנה את המחלקה
הידועה שמי שהשתמש באובג'קט אוריינטד או למד אובג'קט אוריינטד בטח בנה אותה המון פעמים. פרסון, מחלקה שמתארת אדם.
אז מה שנכון לבצע זה קודם כל כל מחלקה אנחנו בונים בקובץ נפרד. אז בואו נייצר פה קובץ שנקרא person.js ופשוט יש לנו באקמה סקריפט 6 גרסה 6 של ג'אווה סקריפט אפשרות לבנות קלאסים.
אס פרסון עכשיו אנחנו רוצים קודם כל שיהיה לנו מאפיינים למחלקה בוא נניח שם פרטי ושם משפחה בתור התחלה אין לנו אפשרות בג'אווה סקריפט להגדיר אותם כדאטה ממברס רגילים כלומר משתנים עם הרשעת גישה פאבליק פאבליק או פרייבט או משהו כזה אין דבר כזה אלא יש לנו קונסטרקטור first name last
name הקונסטרקטור מקבל first name ו last name ויש לנו this first name שווה first name this last name שווה last name ומה שבעצם מתרחש כאן זה שהתחביר של קלאס באקמה סקריפט 6 פשוט הופך את כל הסיפור הזה למה שנקרא ב-JavaScript constructor function זה פשוט פונקציה שמקבלת לסוגריים את שני החבר'ה האלה
ומכניסה אותם עם דיס לאובייקט הנוכחי שעל ידי ניו יצר את הפונקציה או השתמש בפונקציה. זאת אומרת שאם אנחנו נעשה ניו למחלקה אז יהיה לנו אובייקט ממנה.
אז כל הסיפור הזה הוא בעצם סיפור ששייך לג'אווה סקריפט ורק התחביר הזה בעצם משתמש בתחביר קצת אחר בשביל מה שנקרא סינטקטיק שוגר לעשות בעצם תחביר אחר לג'אווה סקריפט הרגיל.
חשוב לנו להבין איך אנחנו משתמשים בזה בנאו-ג'י-אס, כלומר, זה שכתבתי פה קלאס, האם אני יכול כבר להשתמש איתה בקבצים אחרים? התשובה היא לא.
אבל בואו רגע נשלים את הקלאס ואז נראה איך אנחנו משתמשים איתה. אז אנחנו רוצים גם פונקציה. אז שוב, אין לנו כאן הרשאות גישה פאבליק פרייבט כל הדברים האלה, הכל אוטומטית הוא פאבליק כשאנחנו כותבים אותו ברמת הקלאס ופשוט אני רוצה פונקציה שמציגה את הפרטים. בואו נקרא לה דיספליי ויש
לנו פה או console.log, נניח מי זה ה-first name, ונדפיס this first name. בואו נשכפל את זה גם ל-last name, ויש לנו this.last name, והנה יש לנו מחלקה מאוד פשוטה שמתארת בן אדם, יכול להיות מצב שאנחנו רוצים באפליקציה לבנות כל מיני אנשים,
לקוחות, ספקים, עובדים. עכשיו אנחנו רוצים לחשוף את המחלקה הזאת החוצה, ב-node.js אנחנו חושפים מהקובץ שהוא בעצם מודול על ידי מודול נקודה אקספורטס.
אבל אנחנו לא מכניסים כאן איזשהו משתנה. כאשר אנחנו חושפים מחלקה, אנחנו תמיד נחשוף את המחלקה בצורה כזאת. כלומר, אנחנו לוקחים את כל המחלקה וכל המחלקה זה הדבר היחידי שנחשף מהקובץ על ידי השמה לתוך אקספורטס. אנחנו לא חושפים עוד משהו, עוד אחרת או עוד פונקציה אחרת על ידי יצירת איזשהו
אובייקט או משהו כזה, כמו שתמיד היינו עושים כאשר אנחנו היינו חושפים פונקציות. כשלמדנו איך לחשוף מידע ממודול ראינו שיש שתי שיטות, או לחשוף מספר אלמנטים או לחשוף פונקציה אחת.
אז כאשר אנחנו משתמשים במחלקה אנחנו חושפים רק מחלקה אחת, כאילו שהיינו חושפים פונקציה אחת. ועכשיו אנחנו רוצים להשתמש במחלקה הזאת, זה אומר שאנחנו צריכים לגשת ל-app.js ודבר ראשון אנחנו רוצים const ולייבא על ידי require את המודול של ה-person.js.
אז רגע, מה בעצם חשפנו החוצה? מה שחשפנו החוצה זה את המחלקה person ולכן מה שאנחנו בונים כאן זה אובייקט שנקרא person והנה יש לנו פה בעצם, זה לא אובייקט זה קלאסט ליתר דיוק, יש לנו כאן בעצם שוני בין require שחושף פונקציות או פונקציה אחת לבין require שחושף מחלקה.
require שחושף מחלקה, אנחנו תמיד נרשום את השם של המחלקה שהוא חושף עם אות ראשונה גדולה, כי בעצם מה יש עכשיו אחרי שעשינו require כאן?
בואו נלך וניגש לפרסון. יש את כל המחלקה עצמה, ולכן אני לעולם לא אקרא לזה person עם פי קטנה, כי מי שמסתכל על הקוד הזה יחשוב שזאת פונקציה.
אני אקרא לזה person עם פי גדולה, וזה הדבר היחידי שאנחנו עושים עם אותיות גדולות. רק שמות של קלאסים. const my first object or person or my first man, בואו נקרא לזה man שווה new person.
הקונסטרקטור שלנו מקבל first name last name, מוישה רופניק, הדמות המיתולוגית. ואז יש לנו my first man נקודה דיספליי, אנחנו יכולים עכשיו להריץ את התוכנית Node-up ולראות שיש לנו First Name ו-Last Name.
אז הנה יש לנו כרגע מחלקה מאוד פשוטה שחושפת איזה שני משתנים החוצה. אנחנו יכולים לבנות כמה אובייקטים שאנחנו רוצים. בואו אולי לצורך הדוגמה נבנה MySecondMan וזה יהיה החבר שלו.
ויש לנו פה את my second man נריץ. הכל עובד, אנחנו יכולים עכשיו למנות כמה אובייקטים שאנחנו רוצים מהמחלקה שבנינו. עכשיו, מה בקשר באמת ל-incapsulation?
הרי לתוך first name ו-last name אנחנו יכולים להכניס כל מה שבא לנו, אבל ה-incapsulation האמיתי אומר, רגע, יכול להיות מצב שיש פה איזה ערך שהוא בעצם לא חוקי, ואתם לא רוצים לאשר להכניס דברים לא חוקיים לתוך המידע עצמו.
המידע עצמו הוא מאוד מאוד חשוב, אני לא רוצה להכניס כל דבר אליו. לתוך first name ו-last name בואו נניח שאין לי בעיה להכניס הכל, אבל בואו נניח שיש גם גיל, age לפרסון.
ו-age זה אומר, רגע, מותר לכם להכניס ל-age רק ערכים שהם מספריים וחיוביים בלבד. אז מה אנחנו עושים? אז אם הייתי מגדיר את זה באותה הצורה זה לא היה בסדר, הייתי יכול להכניס מבחוץ כל דבר לתוך הערכים האלה, לתוך Age.
אז בואו נראה איך אנחנו תוקפים את ה-Concept של Incapsulation כאשר אנחנו רוצים בעצם לדאוג שהמידע הוא חוקי. אז אנחנו רוצים לקבל גם Age לתוך ה-Constructor ומה שאנחנו עושים כאן אנחנו יוצרים ב-dis underline Age