• דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

אתחול אובייקט ב-TS.

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 5 כותבים 294 צפיות
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • Y מחובר
    Y מחובר
    yyy
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי אובייקט שנראה כך

    export class myClass{
       x:number;
       y:number;
       z:number;
       constructor( x:number,y:number ) {
     this.x = x;
     this.y = y;
      this.z =this.x*this.y;
       }
    }
    

    אני מנסה ליצור ממנו מופע כך

     MC:myClass {x:10,y:5} 
    

    אני מצפה ש-Z יחושב אוטומטית. בפועל אני מקבל שגיאה ש-

    Property 'z' is missing
    

    השאלה היא כיצד ניתן לגרום למחשב להבין שיש התייחסות ל-z.
    תודה רבה

    yossizY י 2 תגובות תגובה אחרונה
    0
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לyyy ב נערך לאחרונה על ידי
    #2

    @yyy מי שמאכלס את המאפיין z הוא הבנאי (constructor). כדי להתשמש בבנאי אתה צריך להשתמש ב-new:

    let MC:myClass = new myClass(10, 5)
    console.log(MC.z)
    // 50
    

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    upsilon01U תגובה 1 תגובה אחרונה
    8
  • upsilon01U מנותק
    upsilon01U מנותק
    upsilon01
    השיב לyossiz ב נערך לאחרונה על ידי
    #3

    בהמשך לדברי @yossiz

    כדאי ש z יהיה getter
    ואז פעולת החישוב תתבצע כשקוראים את הערך שלו

    public get z() {
    return this.x * this.y;
    }
    

    הערת אגב:
    אם כוונתך לאכלס את x ו y רק דרך הבנאי
    כדאי שהם יהיו private

    yossizY תגובה 1 תגובה אחרונה
    5
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לupsilon01 ב נערך לאחרונה על ידי
    #4

    @upsilon01 אמר באתחול אובייקט ב-TS.:

    ואז פעולת החישוב תתבצע כשקוראים את הערך שלו

    אבל מצד שני החישוב יתבצע בכל קריאה.
    אבל גם לזה יש פתרון, על ידי שמירת התוצאה של החישוב.
    אבל כל זה לא רלוונטי בחישוב כל כך פשוט.

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    upsilon01U תגובה 1 תגובה אחרונה
    6
  • upsilon01U מנותק
    upsilon01U מנותק
    upsilon01
    השיב לyossiz ב נערך לאחרונה על ידי
    #5

    @yossiz
    הרעיון הוא שאם x או y משתנים אחרי האתחול (כי הם לא private)
    אז הערך של z יהיה שגוי,
    אם יש משהו יותר גרוע מבעיית ביצועים, זה חישוב שגוי.

    תגובה 1 תגובה אחרונה
    4
  • י מנותק
    י מנותק
    יוסף בן שמעון
    השיב לyyy ב נערך לאחרונה על ידי
    #6

    @yyy המחלקה הבאה תתן לך אותה תוצאה בחצי קוד:

    class shortClass{
        z:number;
        constructor(private x:number, private y:number){
            this.z = x * y;
        }
    }
    

    איך זה קורה? כשאתה מעביר ארגומנטים לקונסטרקטור, אם אתה מצהיר עליהם פרייבט או פאבליק, TS מבין שהם אמורים להיות נכסים של המחלקה ולא משתנים מקומיים, ומבצע עבורך את העבודה.

    https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBAYwDYEMDOa4FsCeBhVDOAbwCg4K4QAuOAOwFcsAjYKAbnMp1sZbc6U4AL15NWHLhQQQ6aGFAYIY0ABQ164tgBo4PTfygBKElKFwYACwCWaAHQg4AXiqDzFK7bs5net+897YV9AhzgAKgsbexx-OABfUkTSZHRMNEtoGAI0siFRPgk4mTkFJRUoVTAoawA3FBhgKmpCnThquoamnlbjPPcor2CXR0jYs0T4oA

    תגובה 1 תגובה אחרונה
    7
  • Y מחובר
    Y מחובר
    yyy
    כתב ב נערך לאחרונה על ידי
    #7

    כעת נתקלת בבעיה דומה:
    האובייקט כעת נראה כך:

    export class myClass{
     x:number;
     y:number=0;
    constructor( x:number ) {
     this.x = x;
     }
    }
    

    נתון מערך ריק של האובייקטים

    myClasses: myClass[] = [];
    

    וכעת אני מנסה לדחוף עם push אובייקט חדש

    this.myClasses.push({x:4});
    

    גם כאן יש שגיאה שהוא רוצה את הערך של y למרות שהוא קבוע על 0. איך פותרים את זה?

    רפאלר תגובה 1 תגובה אחרונה
    0
  • רפאלר מנותק
    רפאלר מנותק
    רפאל
    השיב לyyy ב נערך לאחרונה על ידי רפאל
    #8

    @yyy כדאי להימנע מיצירת מופעים עבור מחלקות בצורה ליטרלית משום שהPrototype שלהם יהיה זהה לזה של Object.

    ההשלכות המצערות:

    • האובייקט לא יכיל את המתודות והProperties של המחלקה.
    • ההצבות (בתוך הבנאי ומחוצה לו) לא יתבצעו (התגלית שהערך של השדה Y במופע שיצרת יהיה זהה לundefined לא אמורה להיות מפתיעה במיוחד כעת).
    • השימוש בisPrototypeOf ו instanceof לא יניב את התוצאה הרצויה (וכן כל המתודות שבPrototype).

    מסקנה:

    • היכן שהשימוש בObject literal נחוץ (ומתאפשר) השתמש בInterface לציון הType (עקב הצורך בערך דיפולטיבי עבור Y האפשרות לא רלוונטית עבורך)
    • צור מופעים עבור מחלקות באמצעות הבנאי:
    class ZeroYCoordinate {
      public readonly y: number = 0;
      constructor(public x: number) { }
    }
    
    const points = [new ZeroYCoordinate(4)]
    

    ** שינוי Prototype אפשרי באמצעות השימוש בsetPrototypeOf, אם כי הדבר אינו מהווה פתרון מקיף לכל הבעיות שציינתי.

    תגובה 1 תגובה אחרונה
    6
  • dovidD dovid העביר נושא זה מ-תכנות ב-

  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.