Διαδρομές
/
JavaScript
JavaScript
/
Ύλη
/
Κληρονομικότητα
Κλ

Κληρονομικότητα σε JavaScript

1 άσκηση

Σχετικά με την έννοια Κληρονομικότητα

Η κληρονομικότητα είναι ένας τρόπος να δημιουργείς σχέσεις γονέα-παιδιού ανάμεσα σε κλάσεις. Η θυγατρική κλάση (κάποιες φορές αναφέρεται ως υποκλάση) έχει πρόσβαση στη συμπεριφορά και τα δεδομένα που ορίζει η γονική κλάση (κάποιες φορές αναφέρεται ως υπερκλάση).

class Pet {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`This is my pet, ${this.name}.`);
  }
}

class Dog extends Pet {}

const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.

Η λέξη-κλειδί extends στη δήλωση της θυγατρικής κλάσης δημιουργεί μια σχέση με τη γονική κλάση μέσω της αλυσίδας πρωτοτύπων.

Τα αντικείμενα που δημιουργεί ο κατασκευαστής της θυγατρικής κλάσης θα έχουν το πρωτότυπο της γονικής κλάσης στην αλυσίδα πρωτοτύπων τους, κάτι που τους δίνει πρόσβαση σε κάθε μέθοδο ή δεδομένο που ορίζει η γονική κλάση.

const dog = new Dog('Otis');

Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true

Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false

Κατασκευαστές

Αν η θυγατρική κλάση δεν ορίζει κάποια συνάρτηση κατασκευαστή, χρησιμοποιείται η συνάρτηση κατασκευαστή της γονικής κλάσης. Ωστόσο, αν η θυγατρική κλάση ορίζει τη δική της συνάρτηση κατασκευαστή, ο κατασκευαστής της γονικής κλάσης πρέπει να κληθεί ρητά. Για να καλέσεις τον κατασκευαστή της γονικής κλάσης μέσα από το πεδίο του κατασκευαστή της θυγατρικής, χρησιμοποιείται η λέξη-κλειδί super.

class Pet {
  constructor(name) {
    this.name = name;
  }
}

class Dog extends Pet {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }
}

const dog = new Dog('Otis', 'Pug');

Επειδή ο κατασκευαστής της γονικής κλάσης είναι υπεύθυνος για την αρχικοποίηση ενός νέου αντικειμένου και την ανάθεσή του στο this, πρέπει να κληθεί πριν ο κατασκευαστής της θυγατρικής χρησιμοποιήσει το this.

class Dog extends Pet {
  constructor(name, breed) {
    // using 'this' before calling the parent constructor with 'super'
    this.breed = breed;
    super(name);
  }
}

const dog = new Dog('Otis', 'Pug');
// => ReferenceError: Must call super constructor in derived class before accessing 'this'...

Ορισμός μεθόδων στη θυγατρική κλάση

Μια θυγατρική κλάση μπορεί να ορίσει δική της συμπεριφορά, επιπλέον αυτής που κληρονομεί από τη γονική.

Αυτός είναι ένας από τους βασικούς λόγους για να χρησιμοποιήσεις την κληρονομικότητα: να έχεις εξειδικευμένες θυγατρικές κλάσεις με τα δικά τους μοναδικά δεδομένα και μεθόδους, που συνδέονται μέσω κοινών μεθόδων και δεδομένων που παρέχει η γονική κλάση.

class Dog extends Pet {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }

  describe() {
    console.log(`${this.name} is a ${this.breed}.`);
  }
}

const dog = new Dog('Otis', 'Pug');
dog.introduce();
dog.describe();
// => 'This is my pet, Otis.'
// => 'Otis is a Pug.'

Υπερκάλυψη μεθόδων που κληρονομούνται από τη γονική κλάση

Μια θυγατρική κλάση μπορεί επίσης να υπερκαλύψει τη συμπεριφορά μιας μεθόδου που ορίζει η γονική κλάση και να την αντικαταστήσει ή να την επεκτείνει με συμπεριφορά που ορίζει η ίδια.

class Cat extends Pet {
  // replacing parent class behavior
  introduce() {
    console.log(`This is my cat, ${this.name}.`);
  }
}

class Dog extends Pet {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }

  describe() {
    console.log(`${this.name} is a ${this.breed}.`);
  }

  // extending parent class behavior
  introduce() {
    super.introduce();
    this.describe();
  }
}

const cat = new Cat('Milo');
cat.introduce();
// => 'This is my cat, Milo.'

const dog = new Dog('Otis', 'Pug');
dog.introduce();
// => This is my pet, Otis.
// => Otis is a Pug.

Για να καλέσεις μια μέθοδο που έχει οριστεί στη γονική κλάση μέσα από το σώμα μιας μεθόδου με το ίδιο όνομα στη θυγατρική κλάση, πρέπει να χρησιμοποιήσεις τη λέξη-κλειδί super για να αναφερθείς στη γονική κλάση.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Κληρονομικότητα