reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

JavaScript dynamické vytváření tříd

xmarek (1676)|14.4.2010 21:38
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 :D tak Vás tímto prosím o radu.
function Osoba(attributs){
for (var i in attributs) {
(function(){
this["get" + i] = function(){
return attributs;
};
this["set" + i] = function(value){
attributs = 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.
Dojigiri (1629)|15.4.2010 12:10
celkem zajímavá věc s tím function(), ale je to celý nějak blbě

[LIST=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
  • použití přímo attributs 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:

    [code]
    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);
    }
    }

    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());
    [/code]

    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:

    [code]
    function Osoba(attributs){
    for (var i in attributs) {
    eval("this." + i + " = \"" + attributs + "\";");
    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());
    [/code]
    xmarek (1676)|15.4.2010 15:03
    Klobouk dolů. :thumb Hluboká poklona. :thumb