Autor Zpráva
Naith
Profil
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
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
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
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
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
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í.

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: