Sobes.tech
Middle

Čo sú to prototypy v JavaScript?

sobes.tech AI

Odpoveď od AI

V JavaScripte môžu objekty dediť vlastnosti a metódy od iných objektov prostredníctvom mechanizmu prototypov. Každý objekt v JavaScripte má vnútornú skrytú vlastnosť [[Prototype]], ktorá odkazuje na iný objekt, ktorý je jeho prototypom. Keď sa pristupuje k vlastnosti alebo metóde objektu, JavaScript engine najskôr hľadá v samotnom objekte. Ak ju nenájde, odkazuje na vlastnosť [[Prototype]] a hľadá v prototypu. Tento proces sa opakuje po reťazci prototypov, kým sa vlastnosť nenájde alebo kým nedosiahne null (koniec reťazca).

Hlavné koncepty:

  • Prototypový reťazec: Sekvencia objektov spojených cez vlastnosť [[Prototype]].
  • Dedičstvo: Objekty dedí vlastnosti a metódy svojich prototypov.
  • __proto__: Historicky používaná (hoci nie štandardizovaná pôvodne) vlastnosť na prístup k [[Prototype]]. Teraz sa odporúča používať Object.getPrototypeOf().
  • prototype: Vlastnosť konštruktora, na ktorú odkazuje [[Prototype]] inštancií vytvorených pomocou tohto konštruktora.

Príklad s konštruktorom a prototypom:

// Konštruktor
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Pridanie metódy do prototypu
Person.prototype.sayHello = function() {
  console.log("Ahoj, volám sa " + this.name);
};

// Vytvorenie inštancie
const person1 = new Person("Alice", 30);

// Volanie metódy z prototypu
person1.sayHello(); // Výstup: Ahoj, volám sa Alice

// Prístup k prototypu inštancie
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Výstup: true

V tomto príklade:

  • Person je funkcia-konštruktor.
  • Person.prototype je objekt, ktorý je prototypom pre všetky inštancie vytvorené pomocou new Person().
  • sayHello je metóda pridaná do prototypu. Všetky inštancie Person dedí túto metódu.
  • Keď sa volá person1.sayHello(), JavaScript engine hľadá sayHello v person1. Ak ju nenájde, odkazuje na [[Prototype]] person1 (ktorý je rovný Person.prototype) a nachádza metódu tam.

Prototypy zabezpečujú efektívne využitie pamäte, pretože metódy a spoločné vlastnosti sú uložené v prototypu, nie sú duplikované v každej inštancii objektu.