Autor Zpráva
waltz
Profil *
Zdravim,

rad by som poprosil znalejsich kolegov o pomoc. V nasledujucom kode sa snazim na objekte dynamicky volat metodu (nazov podla parametra) a tym zmenit hodnotu vlastnosti. V podstate sa dana metoda dynamicky zavola, ale dostane pracuje s vlastnostou, ktora je 'undefined'. Vid. kod:

<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script>
            function main() {
                var F = function() {
                    this.n = 0;
                };
                
                F.prototype = {
                    get : function() {
                        return this.n; 
                    },
                    set : function(n) {
                        alert("this.n = " + this.n);
                        this.n = n;
                    }
                };
                
                F['prototype']['getProp'] = function(prop) {
                    return this[prop];
                };
                
                // vytvor objekt
                var f = new F();
                
                f.set(111); // klasicke volanie
                (f.getProp("set"))(222); // dynamicke volanie
                
                alert("res: " + f.get()); // hodnota nezmenena
            }
        </script>        
    </head>
    <body onload="main();">
    </body>
</html>
pako
Profil *
mozes pouzit uzaver - f.getProp(property) ti vrati funkciu, ktora bude vediet co ma spravit s tym dalsim argumentom (vo vnorenych funkciach je this rovne window/undefined, preto je treba pouzit dalsiu premennu that:
                F['prototype']['getProp'] = function(prop) {
                    var that = this;
                    return function(num) { return that[prop](num);};
                };
pre lepsiu predstavu, dostanes nieco ako toto:
(function(num) {return f.set(num);})(222);

alebo moze uplne zmenit funkciu getProp
                F['prototype']['getProp'] = function(prop,value) {
                    return this[prop](value);
                };
a volat ju takto:
f.getProp(property,value);
waltz
Profil *
dakujem,...v podstate som sa znazil ist takou cestou,..ale nie je mi jasne preco nestaci return this[prop];.

..co ak do prop nepredavam fuknciu ?? ..ale len vlastnost, napr 'n' (t.z. premennu): f.getProp("n"); -> v tomto pripade sa mi nevrati hodnota, ale funkcia (co je v podstate nezelane);

..prikladom nechcem nic konkretne riesit, len skusam moznosti..

O uzaveroch mam uz celkom dost precitane,..aj o prototype; ale obcas ma JS prekvapi...trochu sa v tom zacinam stracat :/
pako
Profil *
return this[prop] ti vrati len hodnotu tej vlastnosti

mohol by si pouzit takuto konstrukciu:
                    if (typeof this[prop] === 'function') {
                        return this[prop]();
                    }
                    else {
                        return this[prop];
                    }
ale nie na funkciu ktorej potrebujes este predat dalsie argumenty...
1Pupik1989
Profil
return this[prop]; nestačí, protože se nevrátí metoda objektu, nýbrž samotná funkce. A pokud funkce není volána jako funkce.call(nejakyObjekt,parametr) nebo funkce.apply(nejakyObjekt,pole_prametru), tak je v this objekt window jako její rodič.

Pokud byste chtěl zavolat tu metodu v objektu F, tak by to vypadlo asi takto
f.getProp("set").call(f,222), což není moc hezké. Ideální řešení je to od uživatele pako.
_es
Profil
waltz:
Viď aj Co znamená a jak se používá v JavaScriptu this?.
waltz
Profil *
..vdaka za odpovede..nastudujem trocha viac..

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: