Az öröklődés segítségével szülő-gyerek kapcsolatot hozhatsz létre osztályok között. A gyermekosztály (amelyet néha alosztálynak is neveznek) hozzáfér a szülőosztály (amelyet néha főosztálynak is neveznek) által meghatározott viselkedéshez és adatokhoz.
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.
A gyermekosztály deklarációjában szereplő extends kulcsszó a prototípláncon keresztül teremt kapcsolatot a szülőosztállyal.
A gyermek konstruktorával létrehozott objektumok prototípláncában ott lesz a szülőosztály prototípusa, így hozzáférnek minden metódushoz és adathoz, amelyet a szülő definiál.
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
Ha a gyermekosztály nem definiál konstruktorfüggvényt, akkor a szülő konstruktorfüggvényét használja.
Ha viszont a gyermekosztály saját konstruktorfüggvényt definiál, a szülő konstruktorát explicit módon meg kell hívni.
A szülő konstruktor meghívásához a gyermek konstruktorának a hatóköréből a super kulcsszót használjuk.
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');
Mivel a szülő konstruktor felelős az új objektum inicializálásáért és a this-hez rendeléséért, még azelőtt meg kell hívni, hogy a gyermek konstruktora használná a this-t.
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'...
A gyermekosztály a szülőtől örökölt viselkedés mellett saját viselkedést is definiálhat.
Ez az egyik fő oka annak, hogy öröklődést használunk: hogy specializált gyermekosztályaink legyenek saját egyedi adatokkal és metódusokkal, amelyeket a szülőosztály által biztosított közös metódusok és adatok kötnek össze.
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.'
A gyermekosztály felül is írhatja a szülő által definiált metódus viselkedését, és lecserélheti vagy kiterjesztheti azt a saját maga által definiált viselkedéssel.
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.
Ha a gyermekosztály egy ugyanilyen nevű metódusának törzséből szeretnéd meghívni a szülőosztályon definiált metódust, a super kulcsszóval kell a szülőre hivatkoznod.