Sobes.tech
Middle

Co jsou to prototypy v JavaScriptu?

sobes.tech AI

Odpověď od AI

V JavaScriptu mohou objekty dědit vlastnosti a metody od jiných objektů prostřednictvím mechanismu prototypů. Každý objekt v JavaScriptu má interní skrytou vlastnost [[Prototype]], která odkazuje na jiný objekt, jeho prototyp. Když se přistupuje k vlastnosti nebo metodě objektu, JavaScript nejprve hledá v samotném objektu. Pokud ji nenajde, odkazuje na vlastnost [[Prototype]] a hledá v prototypu. Tento proces se opakuje po řetězci prototypů, dokud se vlastnost nenajde nebo nedojde k null (konec řetězce).

Hlavní koncepty:

  • Řetězec prototypů: Sekvence objektů propojených přes vlastnost [[Prototype]].
  • Dědičnost: Objekty dědí vlastnosti a metody svých prototypů.
  • __proto__: Historicky používaná (ačkoliv ne standardizovaná původně) vlastnost pro přístup k [[Prototype]]. Dnes je doporučeno používat Object.getPrototypeOf().
  • prototype: Vlastnost konstruktoru, na kterou odkazuje [[Prototype]] instancí vytvořených tímto konstruktorem.

Příklad s konstruktorem a prototypem:

// Konstruktor
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Přidání metody do prototypu
Person.prototype.sayHello = function() {
  console.log("Ahoj, jmenuji se " + this.name);
};

// Vytvoření instance
const person1 = new Person("Alice", 30);

// Volání metody z prototypu
person1.sayHello(); // Výstup: Ahoj, jmenuji se Alice

// Přístup k prototypu instance
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Výstup: true

V tomto příkladu:

  • Person je konstruktorová funkce.
  • Person.prototype je objekt, který slouží jako prototyp pro všechny instance vytvořené pomocí new Person().
  • sayHello je metoda přidaná do prototypu. Všechny instance Person dědí tuto metodu.
  • Když voláme person1.sayHello(), JavaScript engine hledá sayHello v person1. Pokud ji nenajde, odkazuje na [[Prototype]] person1 (který je roven Person.prototype) a najde metodu tam.

Prototypy umožňují efektivní využití paměti, protože metody a sdílené vlastnosti jsou uloženy v prototypu, nikoliv duplikovány v každé instanci objektu.