Autor Zpráva
TomasJ
Profil
Zdravím, začínám s OOP v JavaScriptu, čtu návody a momentálně se pokouším udělat co nejjednodušší destruktor objektu. Dá se udělat nějaký zautimatizovaný? Tím myslím, jestli jde udělat něco jako this = null; a tím by zanikly všechny, nazývám-li to správně, metody a atributy objektu. Zatím jsem dokázal akorát jednotlivé metody (?) nastavit na null, ale vše najednou se mi nepodařilo (pokud to vůbec jde?).
Vyřešil jsem to. Možná to jde i lépe (efektivněji, správněji, ...), ale to co chci, to plní.
  destruct: function(){
    for(var id in this){
      this[id] = null;
    }
  }
Chamurappi
Profil
Reaguji na TomaseJ:
ale to co chci, to plní
A co vlastně chceš? Paměť uvolňuje garbage collector, jakmile k datům nevede žádná cesta a až když usoudí, že ji potřebuje.

tím by zanikly všechny, nazývám-li to správně, metody a atributy objektu
Nemusí zaniknout, ani když je nastavíš na null, pokud existují proměnné, do kterých byly přiřazeny. Metoda je jen obyčejná funkce, je přenosná mezi objekty.

Zatím jsem dokázal akorát jednotlivé metody (?) nastavit na null
K čemu pak takový objekt je? Pokud je uložený v nějaké proměnné, bude v ní uložený nefunkční pozůstatek.
V jakých návodech k OOP v JS jsi našel, že má smysl psát destruktor?
preca1
Profil
Zdravim,
jestli funguje this = null si můžeš vyzkoušet.
Tvojí metodou destruct smažeš všechny metody a atributy, ale ten objekt bude pořád existovat.
var instance = new MyObject('instance name');
instance.name; // vypíše 'instance name'
instance.destruct();
instance.name; // vypíše null, pořád je ale alokovaná paměť pro instanci instance (kdo ví, co to znamená...)
instance = null; // teprv teď si garbage collectoru řek, že může ono místo uvolnit. Toto je to, co hledáš

Onehdá sem řešil něco podobného a vyřešil sem to továrnou, která vytvářela instance a pak je za mě všechny ve správném momentu mazala.


Zajímavé čtení o GC
TomasJ
Profil
No vypsal jsem si data z objektu při načtení stránky. Pak jsem přes JavaScriptový zápisník volal nějaké metody z vytvořené instance objektu a vykřikoval mi chyby, že taková funkce neexistuje. Ale jak oba píšete, objekt zůstane, takže musím vymazat instanci.
preca1:
Ano, to je nejspíš to, co potřebuji. Díky. :)

Chamurappi:
V jakých návodech k OOP v JS jsi našel, že má smysl psát destruktor?
Právě že nikde, jen mě to tak napadlo. V PHP jsem zvyklý používat destruktor a teď jsem se začal věnovat JS podrobněji než jen vše mít funkcionální. Takže jsem si navrhl strukturu objektu a řídil jsem se tak nějak podle svého, protože jsem četl několik článků a všude se píše o "správném" navrhování něco jiného. Pak jsem našel na jedné české stránce údajně nejsprávnější řešení, používající MixIns (asi víte o čem to píšu), jen jsem ho dostatečně nepochopil a tak jsem začal přibližně takto:

var MujObjekt = function(vstup) {
  this.vstupOdUzivatele = vstup;
}

MujObjekt.prototype = {
  ziskejVstup: function() {
    return this.vstupOdUzivatele;
  },
  zmenVstup: function(novyVstup) {
    this.vstupOdUzivatele = novyVstup;
  }
}

var Instance = new MujObjekt("prvni nezmeneny vstup");
document.write(Instance.ziskejVstup());
Instance.zmenVstup("zmeneny vstup");
alert(Instance.ziskejVstup());
Nevím, jestli je to tedy správné řešení. Mohl by mi někdo ukázat případné chyby v návrhu?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: