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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. אתחול אובייקט ב-TS.

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

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 5 כותבים 374 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yyyY מנותק
    yyyY מנותק
    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
              • yyyY מנותק
                yyyY מנותק
                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
                  • דף הבית
                  • קטגוריות
                  • פוסטים אחרונים
                  • משתמשים
                  • חיפוש
                  • חוקי הפורום