Autor | Zpráva | ||
---|---|---|---|
Naith Profil |
#1 · Zasláno: 17. 2. 2014, 19:26:31
Zdravím potřeboval bych v rámci třídy volat dynamicky její metodu nějak takto:
var Banner = function () { function FceJedna(par){ ... } function FceDva(par){ ... } //toto nelze protoze metoda neexistuje v globalnim objektu function caller(fce, par){ window[fce](par); } //test dynamickeho volani function Test(){ caller("FceDva",5); } }() Neexistuje způsob, jak podobným způsobem zavolat metodu v třídě? Děkuji |
||
Naith Profil |
#2 · Zasláno: 18. 2. 2014, 10:49:11
Takže lze to, ale trochu oklikou. Pokud by to někdo potřeboval, tak takto:
HTML <div class="test" id="test">Toto je zaklad</div> JS var dynamic = function (){ var dfce = Array(); //funkce volana dynamicky dfce['Afce'] = function (){ $('#test').html('Toto je test A'); } //druha funkce volana dynamicky dfce['Bfce'] = function (){ $('#test').html('Toto je test B'); } return{ Test: function(){ dfce['Afce'](); setInterval(function(){dfce['Bfce']()}, 10000); } } }() dynamic.Test(); |
||
Chamurappi Profil |
#3 · Zasláno: 18. 2. 2014, 10:54:47
Reaguji na Naitha:
„ window[fce](par); “
Proč window , když všechny zmíněné funkce jsou lokální proměnné?
„ var dfce = Array(); “
Proč Array ? Ty potřebuješ length ? Nebo číselné indexy?
„Neexistuje způsob, jak podobným způsobem zavolat metodu v třídě?“ Viz Dvojí přístup ke členu objektu. |
||
Naith Profil |
#4 · Zasláno: 18. 2. 2014, 12:48:37
Chamurappi:
Děkuji za reakci. ad 1. uvedl jsem do komentáře, že to nemůže fungovat, ale šlo mi o tento typ volání funkce. ad 2. nepotřebuji ani délku, ani číselný index, to pole je asociativní a potřebuji klíč, pod kterým je metoda uložena. Je to z toho důvodu, že ji lze pak volat touto konstrukci: var nazev_funkce = 'Bfce'; dfce[nazev_funkce](); |
||
Chamurappi Profil |
#5 · Zasláno: 18. 2. 2014, 12:56:13
Reaguji na Naitha:
Asociativní pole v JS neexistují. Respektive jako asociativní pole se chová každý objekt. Včetně číselného pole Array , takže to funguje, ale je nesmysl použít Array .
„v rámci třídy“ Dovolím si podotknout, že to nevypadá jako třída, ale jako funkcí vytvořený objekt. Kdybys používal konstruktory a objekty, tak bys do this.metoda přiřadil v konstruktoru funkci nebo bys ji dal do Banner.prototype.metoda a volal bys ji buď jako instance.metoda() , nebo jako instance["metoda"]() (kde pochopitelně za řetězec můžeš dosadit i proměnnou).
|
||
Naith Profil |
#6 · Zasláno: 18. 2. 2014, 13:30:14
Chamurappi:
Ano je pravda, že toto řešení je divné, ale našel jsem i pozitivní stránku v tom, že takto mohu sestavit kolekci dynamicky volatelných funkcí, zatímco u ostatních, u kterých je to nežádoucí takto volat nepůjdou. Chová se to jako statická třída a vlastně se tak i volá. Zvolil jsem ji proto, že dle "Pixyho" je to dobře zapouzdřená třída, která se nebude třískat s ostatními, tedy alespoň doufám. Určitě by to šlo vyřešit lépe, ale objektový model JS včetně closures je pro mě poněkud nepřehledný, ale snažím se tím prokousat. Díky za nasměrování. |
||
Časová prodleva: 10 let
|
0