V čom spočíva rozdiel medzi objektovo orientovaným programovaním v JavaScripte a OOP v iných programovacích jazykoch?
sobes.tech AI
Odpoveď od AI
JavaScript používa prototypové dedičstvo namiesto triedneho.
V triednych jazykoch sú objekty inštanciami tried, ktoré opisujú ich štruktúru a správanie. Dedičstvo sa realizuje rozširovaním existujúcich tried.
V JavaScripte nie sú triedy v tradičnom zmysle. Objekty sa vytvárajú priamo alebo na základe iných prototypových objektov. Dedičstvo je realizované cez reťazec prototypov, kde má každý objekt odkaz na svoj "rodičovský" prototyp. Pri prístupe k vlastnosti alebo metóde objektu JavaScript najskôr hľadá v samotnom objekte, potom v jeho prototypu, potom v prototypu prototypu a tak ďalej po reťazci.
Príklad vytvorenia objektu a dedičstva v JavaScripte:
// Vytvorenie prototypového objektu
const animal = {
speak() {
console.log('Nejaký všeobecný zvuk');
}
};
// Vytvorenie objektu na základe prototypu
const dog = Object.create(animal);
// Prepisovanie metódy pre nový objekt
dog.speak = function() {
console.log('Hav!');
};
dog.speak(); // Vypíše "Hav!"
Porovnanie triedneho a prototypového OOP:
| Charakteristika | Triedne OOP (Java, C++) | Prototypové OOP (JavaScript) |
|---|---|---|
| Hlavný mechanizmus | Triedy a inštancie tried | Objekty a prototypy |
| Dedičstvo | Dedičstvo tried pomocou 'extends' | Dedičstvo cez reťazec prototypov |
| Vytváranie objektov | Pomocou kľúčového slova 'new' a konštruktora | Priamo, Object.create(), konštruktory (funkcie) |
| Polymorfizmus | Prepisovaním metód v triedach | Prepisovaním vlastností a metód v objektoch |
| Zapuzdrovanie | Modifikátory prístupu (public, private, protected) | Dohody a použitie uzávierok (closures) |
Zavedenie tried v ECMAScript 2015 (ES6) prinieslo syntaktický cukor nad prototypovým dedičstvom, čím sa OOP v JavaScripte stalo podobnejším triednym jazykom, ale základný mechanizmus zostáva prototypový.
// Príklad použitia tried v ES6
class Animal {
speak() {
console.log('Nejaký všeobecný zvuk');
}
}
class Dog extends Animal {
speak() {
console.log('Hav!');
}
}
const myDog = new Dog();
myDog.speak(); // Vypíše "Hav!"