JavaScriptové perličky V.
Jednou ze zajímavostí JavaScriptu je, že každý objekt má vlastnost
prototype
. Tato vlastnost je objekt, s prazvláštním chováním – jakoukoliv
jeho vlastnost budou mít všechny instance třídy jeho vlastníka. Zmatené? Třeba
pomůže příklad:
objekt1 = new Trida(); objekt1.prototype.vlastnost = 377; // nebo: Trida.prototype.vlastnost = 377; objekt2 = new Trida(); document.write(objekt2.vlastnost); // 377 document.write(objekt1.vlastnost); // 377
Jak je vidět, vlastnosti z prototypu se do instancí objektů doplňují i zpětně.
Prototypování se dá hezky využít ve spojitosti s objektovými literály při definici nové třídy:
function Trida() {}; // konstruktor; Trida.prototype = { vlastnost1: null, vlastnost2: null, ... vlastnostN: null, }
Samozřejmě, vlastnosti objektů jde takto nastavovat v konstruktoru (this.vlastnost1
= null
) a je to i výhodnější, protože některé vlastnosti se typicky
inicializují na základě parametrů, které konstruktoru předáváme, a jejich
hodnoty tedy nejsou při tvorbě prototypu známy. Z hlediska čistoty kódu je lepší mít nastavování
všech vlastností (i těch inicializovaných staticky) na jednom místě a
konstruktor je na to nejvhodnější.
Na co se tedy nastavování vlastností v prototypu naopak hodí? Na definici metod objektů. Ty se určitě nijak nemění a dají se v prototypu nastvit pomocí lambda funkcí:
Trida.prototype = { secti: function (a, b) { return a + b; }, odecti: function (a, b) { return a - b; } }
To už skoro vypadá jako deklarace třídy v nějakém klasickém objektovém jazyce, a opravdu to funguje úplně stejně. Pomocí prototypů se dá také v JavaScriptu definovat dědičnost, ale o tom až někdy příště. I když bystřejší čtenáři by si to možná už po dnešním dílu uměli dát dohromady...