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.