Čo je prototypové dedičstvo v JavaScript?
sobes.tech AI
Odpoveď od AI
Objekty v JavaScripte dedičia vlastnosti a metódy od svojich prototypov. Prototyp každého objektu je iný objekt, ktorého vlastnosti a metódy sú dostupné cez reťazec prototypov.
Pri prístupe k vlastnosti objektu JavaScript najskôr hľadá priamo v samotnom objekte. Ak vlastnosť nenájde, pokračuje v hľadaní v prototypu tohto objektu, potom v prototypu prototypu a tak ďalej, až kým vlastnosť nenájde alebo nedosiahne koniec reťazca (null).
Prototypové dedičstvo sa líši od klasického dedičstva (napríklad v Jave alebo C++), kde sú objekty vytvárané z tried, ktoré opisujú ich štruktúru a správanie. V JavaScripte sú triedy, ktoré sa objavili v ES6, syntaktickým cukrom nad prototypovým dedičstvom.
Hlavné aspekty:
- __proto__: Vnútorná vlastnosť objektu, odkazujúca na jeho prototyp.
- prototype: Vlastnosť konštruktora (funkcie, ktorá sa používa ako konštruktor), odkazujúca na objekt, ktorý bude slúžiť ako prototyp pre vytvárané inštancie.
- Object.getPrototypeOf(obj): Štandardný spôsob, ako získať prototyp objektu.
- Object.setPrototypeOf(obj, proto): Štandardný spôsob, ako nastaviť prototyp objektu.
Príklad:
// Konštrukčná funkcia
function Animal(name) {
this.name = name;
}
// Pridanie metódy do prototypu Animal
Animal.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
// Vytvorenie inštancie
const dog = new Animal("Buddy");
// Volanie metódy z prototypu
dog.sayHello(); // Výstup: Hello, my name is Buddy
// Prototyp psa je Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Výstup: true
// Prototyp Animal.prototype je Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Výstup: true
// Koniec reťazca prototypov je null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Výstup: true
Porovnanie s klasickým dedičstvom (pomocou ES6 tried):
class Animal {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Volanie konštruktora rodičovskej triedy
this.breed = breed;
}
bark() {
console.log("Woof!");
}
}
const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Výstup: Hello, my name is Buddy (dedičstvo od Animal)
buddy.bark(); // Výstup: Woof! (metóda Dog)
// Triedy v ES6 sú cukrom nad prototypmi
console.log(Object.getPrototypeOf(Dog) === Animal); // Výstup: true (dedičstvo medzi triedami)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Výstup: true (dedičstvo metód cez prototypy)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Výstup: true (inštancia dedí od prototypu triedy)
Prototypové dedičstvo je kľúčovou koncepciou v JavaScripte, ktorej pochopenie je nevyhnutné pre efektívnu prácu s jazykom.