Sobes.tech
Middle

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!"