הרחבת הכיתות

מילת המפתח extends משמשת בהצהרות או בביטויים לכיתה כדי ליצור מחלקה שמשמשת כמחלקה משנית של מחלקה אחרת, עם המחלקה ההורה (לפעמים שנקרא 'סיווג הבסיס', משמש כאב הטיפוס של כיתת הצאצא (לפעמים) שנקרא 'מחלקה משנית' או "סיווג נגזר").

class ParentClass {}
class ChildClass extends ParentClass {}

Object.getPrototypeOf( ChildClass );
> class ParentClass {}

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

כיתות צאצא יכולות לספק הטמעות משלהן של השיטות שעברו בירושה מכיתת הורה:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}
class ChildClass extends MyClass {
  classMethod() {
    console.log( `The value was '${ this.instanceProp },' and its type was '${ typeof this.instanceProp }.'`)
  }
}

const myParentClassInstance = new MyClass( "My string." );
const mySubclassInstance = new ChildClass( 100 );

myParentClassInstance.classMethod();
> "The value type was 'string.'"

mySubclassInstance.classMethod();
> "The value was '100,' and its type was 'number.'"

אתם יכולים גם לקרוא ל-methods שמוגדרות בכיתת ההורה בהקשר של כיתה של צאצא משתמשת ב-super:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}

class ChildClass extends MyClass {
  subclassMethod() {
    super.classMethod();
    console.log( `The value type was '${ typeof this.instanceProp }.'`)
  }
}
const mySubclassInstance = new ChildClass( 100 );

mySubclassInstance.subclassMethod();
> The value was '100.'
> The value type was 'number.'

כמו בדוגמאות הקודמות, כשמשמיטים את השיטה constructor() ההקשר של מחלקה צאצא, ה-constructor המשתמע של JavaScript קורא להורה וגם את אותה קבוצת ארגומנטים. אבל אם יש ב-constructor של המחלקה המשנית, הוא צריך קודם לקרוא ל-super(), יחד עם את הארגומנטים הדרושים לפני הפניה אל this.

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}

class ChildClass extends MyClass {
    constructor( myPassedValue ) {
        super( myPassedValue );
        this.modifiedProp = myPassedValue + 50;
    }\
    subclassMethod() {
        super.classMethod();
        console.log( `The value type was '${ typeof this.instanceProp }.'`)
    }
}
const mySubclassInstance = new ChildClass( 100 );

mySubclassInstance;
> MyClass { instanceProp: 100, modifiedProp: 150 }

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

class MyClass {
    constructor( originalValue ) {
        this.totalValue = 0;
    }
    set doubleThisValue( newValue ) {
        this.totalValue = newValue * 2;
    }
    get currentValue() {
        console.log( `The current value is: ${ this.totalValue }` );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { totalValue: 0 }

myClassInstance.doubleThisValue = 20;

myClassInstance.currentValue;
> The current value is: 40

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

בדיקת ההבנה

צריך לבחור את ההצהרות הנכונות לגבי כיתות שנוצרו באמצעות מילת המפתח extends.

היא יורשת את המאפיינים ואת השיטות של מחלקת ההורה שלה.
הוא פועל בתור הצאצא של הכיתה שהוא מתרחב.
הוא משמש כהורה של הכיתה שבה הוא מתרחב.
It can't overwrite methods from a parent class.