Tento článok je pokračovaním série o dedičnosti v JavaScripte:

Predsa však, bežnejšia, dostupnejšia a bezpečnejšia forma dedičnosti ako tá čisto objektová je pomocou konštruktorov. Kým sa dostanem k samotnej dedičnosti, nutno jest pochopiť konštruktory.

Konštruktor je objekt triedy Function, teda funkcia:

function Fruit( color )
{
  this.color = color;
}

var apple = new Fruit( "red" );

alert(apple.color); // => "red"

→ Vyskúšajte

Tým sme vytvorili objekt apple, inštanciu Fruit, ktorý má vlastnosť color nastavenú na red. Za operátorom new sedí kus kódu, ktorý okrem iného zavolá funkciu Fruit tak, že jej nastaví this na apple. Asi takto:

// Vytvorí obyčajný objekt
var apple = new Object();
// Zavolá nad ním metódu Fruit
Fruit.call( apple, "red" );

alert( apple.color ); // => "red"

→ Vyskúšajte

Pomocou konštruktora teda pripravíme objekt tým, že mu nastavíme základné vlastnosti. (Špecifikácia ECMAScript 262 tento proces popisuje detailne v sekcii 13.2.2.)

Metódy

Pridajme metódu yellColor, ktorá zareve farbu. Prvé čo nás napadne je:

function Fruit( color )
{
  this.color = color;
  this.yellColor = function() // Toto je fakt že zle
  {
    alert( this.color );
  };
}

var apple = new Fruit( "red" );

apple.yellColor(); // => "red"

→ Vyskúšajte

Kód nám síce funguje, nie že nie. Predstavme si ale, že chceme vytvoriť celé vrece červeného ovocia. Povedzme takých 100ks:

var bag = [];
for( var i = 0; i < 100; i++ )
{
  bag.push( new Fruit( "red" ) );
}

Pre každú jednu inštanciu vytvoríme jeho vlastnú metódu, čím si úspešne zahrávame s časom a nárokmi na pamäť. Skúsme si rozpísať čo sa vlastne deje:

var bag = [];
for( var i = 0; i < 100; i++ )
{
  var apple = new Object();
  apple.color = "red";
  apple.yellColor = function()
  {
    alert( this.color );
  }

  bag.push( apple );
}

Vytvárať kvôli 100ks ovocia 100ks metód je celkom luxus, ktorý si môžeme dovoliť iba málokedy. A nie je to len o rýchlosti a pamäti. Ak by sme takýto kód nechali v našej knižnici a pre jeden z desiatich projektov by sme potrebovali vypisovať farbu ovocia napríklad do konzoly (console.log), neostáva nám iba vytvoriť novú vetvu kódu s iným konštruktorom.

Riešením je definovať metódy na prototype konštruktora (v ďalšej časti).

Ďalšie časti: