Vysvetlite, ako funguje dedičstvo v JavaScripte.
sobes.tech AI
Odpoveď od AI
Dedičstvo v JavaScripte je založené na prototypoch. Každý objekt má vnútornú vlastnosť [[Prototype]] (dostupnú cez __proto__ alebo Object.getPrototypeOf()), ktorá odkazuje na iný objekt.
Pri pokuse o prístup k vlastnosti alebo metóde objektu, ak nie je priamo v objekte, JavaScript ju hľadá v [[Prototype]] tohto objektu, potom v [[Prototype]] prototypu a tak ďalej po reťazci prototypov, až kým nedosiahne koniec (Object.prototype), ktorého [[Prototype]] je null.
Toto je prototypové dedičstvo.
Triedy v ECMAScript 2015 (ES6) sú syntaktickým cukrom nad prototypovým dedičstvom. Poskytujú jednoduchší syntax pre prácu s prototypmi a vytváranie hierarchií objektov.
Príklad použitia prototypového dedičstva pred ES6:
// Konštruktor rodiča
function Animal(name) {
this.name = name;
}
// Metóda rodiča na prototypu
Animal.prototype.sayHi = function() {
console.log(`Ahoj, som ${this.name}`);
};
// Konštruktor potomka
function Dog(name, breed) {
// Volanie konštruktora rodiča
Animal.call(this, name);
this.breed = breed;
}
// Nastavujeme prototyp potomka na prototyp rodiča
// Ukladáme odkaz na konštruktor Dog
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// Pridávame metódu potomka
Dog.prototype.bark = function() {
console.log("Haf-haf!");
};
// Vytvárame inštanciu potomka
const myDog = new Dog("Bobi", "Labrador");
// Používame metódy rodiča a potomka
myDog.sayHi(); // Vypíše: Ahoj, som Bobi
myDog.bark(); // Vypíše: Haf-haf!
Príklad použitia tried (ES6):
// Rodičovská trieda
class Animal {
constructor(name) {
this.name = name;
}
sayHi() {
console.log(`Ahoj, som ${this.name}`);
}
}
// Dediaca trieda, ktorá dedí od Animal
class Dog extends Animal {
constructor(name, breed) {
// Volanie konštruktora rodiča
super(name);
this.breed = breed;
}
bark() {
console.log("Haf-haf!");
}
}
// Vytvárame inštanciu dediacej triedy
const myDog = new Dog("Reks", "Nemecký ovčiak");
// Používame metódy rodiča a potomka
myDog.sayHi(); // Vypíše: Ahoj, som Reks
myDog.bark(); // Vypíše: Haf-haf!
Hlavné body dedičstva v JavaScripte:
- Prototypy: Každý objekt má prototyp.
- Reťazec prototypov: Pri hľadaní vlastnosti alebo metódy sa prehľadávajú prototypy hore po reťazci.
[[Prototype]]: Vnútorná vlastnosť odkazujúca na prototyp.__proto__: Zastaralý, ale často používaný spôsob prístupu k[[Prototype]].Object.getPrototypeOf(): Odporúčaný spôsob prístupu k[[Prototype]].- Konstruktory a
prototype: Pred ES6 sa používali na vytváranie objektov a nastavovanie ich prototypov. - Triedy (ES6): Syntaktický cukor pre prototypové dedičstvo, využívajúci kľúčové slová
class,extends,super.