JavaScriptové perličky VII.

Posledně jsme se zabývali naprogramováním metody clone, jejímž úkolem je získat objekt, který má stejné vlastnosti a jejich hodnoty jako mateřský objekt. Připomínám, že při naprogramování pomocí funkcí eval a toSource jsme se dostali do problémů, protože vlastnosti nastavené už v prototypu se do nového objektu nepřenesly. Dnes k metodě clone zkusíme přistoupit jiným způsobem – projdeme všechny vlastnosti klonovaného objektu a nastavíme je objektu nově vytvořenému:

Object.prototype.clone = function() {
  o = {};
  for (property in this)
    o[property] = this[property];
  return o;
}

Nyní už ukázkový kód z minulého dílu bude fungovat správně.

Výše uvedená metoda clone ale způsobuje pouze mělké kopírování objektu, tj. objekty, na které klonovaný objekt ukazuje ve svých polích se nezkopírují. Malým vylepšením to můžeme napravit:

Object.prototype.clone = function() {
  o = {};
  for (property in this)
    if (this[property] instanceof Object)
      o[property] = this[property].clone();
    else
      o[property] = this[property];
  return o;
}

Je snad vidět, že pro vlastnosti, které jsou objekty, prostě zavoláme metodu clone rekurzivně. Problem solved.

S celým klonováním je ale ještě jeden problém, a to že vytvořená instance není instancí stejné třídy jako původní objekt, ale jen instancí třídy Object s přidanými vlastnostmi. Tento poměrně důležitý problém se mi zatím nepodařilo uspokojivě vyřešit a dost možná to vůbec nejde.