Sobes.tech
Junior

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.