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

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

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

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

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

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

      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 מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי
      #2

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

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

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

      upsilon01U תגובה 1 תגובה אחרונה
      8
      • yossizY yossiz

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

        let MC:myClass = new myClass(10, 5)
        console.log(MC.z)
        // 50
        
        upsilon01U מנותק
        upsilon01U מנותק
        upsilon01
        כתב ב נערך לאחרונה על ידי
        #3

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

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

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

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

        yossizY תגובה 1 תגובה אחרונה
        5
        • upsilon01U upsilon01

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

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

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

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

          yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי
          #4

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

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

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

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

          upsilon01U תגובה 1 תגובה אחרונה
          6
          • yossizY yossiz

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

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

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

            upsilon01U מנותק
            upsilon01U מנותק
            upsilon01
            כתב ב נערך לאחרונה על ידי
            #5

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

            תגובה 1 תגובה אחרונה
            4
            • yyyY yyy

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

              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.
              תודה רבה

              י מנותק
              י מנותק
              יוסף בן שמעון
              כתב ב נערך לאחרונה על ידי
              #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
                • yyyY yyy

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

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

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

                  myClasses: myClass[] = [];
                  

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

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

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

                  רפאלר מנותק
                  רפאלר מנותק
                  רפאל
                  כתב ב נערך לאחרונה על ידי רפאל
                  #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
                  • דף הבית
                  • קטגוריות
                  • פוסטים אחרונים
                  • משתמשים
                  • חיפוש
                  • חוקי הפורום