Favicon Svetmobilne.cz  Svět mobilně Favicon Svetaudia.cz  Svět audia Favicon TVFreak.cz  TV Freak   Fórum Favicon Digimanie.cz  Digimanie   Fórum   Galerie
Zobrazené výsledky: 1 až 3 z 3

Téma: JavaScript dynamické vytváření tříd

  1. #1
    Starousedlík SHW Avatar uživatele xmarek
    Registrace
    May 2008
    Příspěvků
    1,689

    Objevil jsem v jedné knize zajímavý způsob jak dynamicky vytvářet objekty v JavaScriptu a snažím se rozchodit jeden příklad a nějak mi to nejde. Jelikož jsem v JavaScriptu v podstatě beginner tak Vás tímto prosím o radu.
    function Osoba(attributs){
    for (var i in attributs) {
    (function(){
    this["get" + i] = function(){
    return attributs[i];
    };
    this["set" + i] = function(value){
    attributs[i] = value;
    };
    })();
    }
    }


    a tady je použití této třídy:
    var osoba = new Osoba({
    Name: "xmarek",
    Surname: "noname",
    Vek: 30
    });
    alert(osoba.getName() + " " + osoba.getSurname() + osoba.getVek());

    Pochopitelně chybí použití setru (nefunguje). Kdyby někdo přišel na to kde je chyba nebo napsal funkční řešení budu rád. Díky.
    Odpovídat lze po přihlášení

  2. #2
    Starousedlík SHW Avatar uživatele Dojigiri
    Registrace
    Jun 2008
    Příspěvků
    1,636

    celkem zajímavá věc s tím function(), ale je to celý nějak blbě

    1. vypadá to, že this když se použije uvnitř toho function() není reference na původní objekt, ale reference na jinej objekt vyráběnej uvnitř toho function(), takže je třeba do ní předávat instanci shora
    2. použití přímo attributs[i] je problém, protože v okamžiku, kdy ten setter/getter probíhá, má proměnná i pokaždý hodnotu posledního atributu (takže by výsledkem bylo "30 30 30")



    Zkoušel jsem to předělat a takhle mi to funguje včetně setteru:

    Kód:
    function Osoba(attributs){
    	for (var i in attributs) {
    		(function(obj, name, value){
    			obj[name] = value;
    			obj["get" + i] = function(){
    				return this[name];
    			};
    			obj["set" + i] = function(value){
    				this[name] = value;
    			};
    		})(this, i, attributs[i]);
    	}
    }
    
    var osoba = new Osoba({
    	Name: "xmarek",
    	Surname: "noname",
    	Vek: 30
    });
    
    alert(osoba.getName() + " " + osoba.getSurname() + " " + osoba.getVek());
    
    osoba.setSurname("XXX");
    
    alert(osoba.getName() + " " + osoba.getSurname() + " " + osoba.getVek());
    Což mi funguje pod FF 3.5 a IE8. Ale javascript je poměrně platformnově a prohlížečově závislej tak je otázka jestli to půjde všude (např. použití this jako pole jsem neznal, tak nevím jak moc je to standardní)

    Na jistotu by se to dalo taky udělat takhle:

    Kód:
    function Osoba(attributs){
    	for (var i in attributs) {
    		eval("this." + i + " = \"" + attributs[i] + "\";");
    		eval("this.get" + i + " = function(){return this." + i + ";};");
    		eval("this.set" + i + " = function(value){this." + i + " = value;};");
    	}
    }
    
    var osoba = new Osoba({
    	Name: "xmarek",
    	Surname: "noname",
    	Vek: 30
    });
    
    alert(osoba.getName() + " " + osoba.getSurname() + " " + osoba.getVek());
    
    osoba.setSurname("XXX");
    
    alert(osoba.getName() + " " + osoba.getSurname() + " " + osoba.getVek());
    Odpovídat lze po přihlášení



  3. #3
    Starousedlík SHW Avatar uživatele xmarek
    Registrace
    May 2008
    Příspěvků
    1,689

    Klobouk dolů. Hluboká poklona.
    Odpovídat lze po přihlášení

Podobná témata

  1. Webové prohlížeče: JavaScript ve Firefoxu 25.0.1
    Od Ahasver v sekci Internet
    Reakcí: 5
    Poslední příspěvek: 07-12-2013, 22:30
  2. Změna Dynamické IP
    Od 4FEAR v sekci Sítě
    Reakcí: 8
    Poslední příspěvek: 16-01-2012, 21:30
  3. Vytváření Maker ve Windows
    Od Petr S. v sekci OS Windows
    Reakcí: 1
    Poslední příspěvek: 11-07-2008, 08:23
  4. Dynamicke disky
    Od vaclav2211 v sekci Problémy s PC (HW/SW) a řešení
    Reakcí: 1
    Poslední příspěvek: 27-01-2008, 08:14
  5. Dynamické přepínání dvou ISP
    Od Sieben v sekci Sítě
    Reakcí: 11
    Poslední příspěvek: 06-12-2007, 18:09