| 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: 12 let
|
|||
0