Przedłużenie zajęć

Słowo kluczowe extends jest używane w deklaracjach lub wyrażeniach klas do tworzenia klasa, która działa jako podklasa innej z klasą nadrzędną (czasami nazywanej „klasą bazową”), która jest prototypem klasy podrzędnej (czasami podklasą, lub „klasy pochodnej”).

class ParentClass {}
class ChildClass extends ParentClass {}

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

Te podklasy dziedziczą właściwości i metody klasy nadrzędnej. Ten umożliwia rozszerzenie głównej funkcjonalności klasy w taki sposób, aby były bardziej szczegółowe bez przeciążania klasy nadrzędnej, aby dopasować je do każdego możliwego przypadku użycia, lub ponowne implementowanie kodu służącego podobnemu celowi.

Klasy podrzędne mogą udostępniać własne implementacje dziedziczonych metod z klasy nadrzędnej:

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.'"

Można również wywoływać metody zdefiniowane w klasie nadrzędnej w kontekście klasy nadrzędnej klasa podrzędna za pomocą funkcji 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.'

Jak widać w poprzednich przykładach, gdy metoda constructor() została pominięta w kontekst klasy podrzędnej, niejawny konstruktor JavaScript wywołuje metodę nadrzędną z tym samym zestawem argumentów. Jeśli jednak występuje konstruktora w podklasie, musi on najpierw wywołać funkcję super() wraz z dowolnym niezbędnych argumentów przed odniesieniem do 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 }

Pobieranie i ustawianie parametrów to specjalne metody używane wyłącznie do pobierania i definiowania wartości. Metody zdefiniowane za pomocą słów kluczowych get i set pozwalają tworzysz metody, z którymi można wchodzić w interakcje tak, jakby były statyczne; usług.

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

Właściwości get i set są zdefiniowane w prototypowej właściwości klasy, i dlatego są dostępne dla wszystkich instancji klasy.

Sprawdź swoją wiedzę

Wybierz stwierdzenia dotyczące zajęć utworzonych za pomocą słowa kluczowego extends.

Działa jako element podrzędny klasy, którą rozszerza.
Dziedziczy właściwości i metody swojej klasy nadrzędnej.
Działa jako element nadrzędny klasy, którą rozszerza.
It can't overwrite methods from a parent class.