Zusätzlichen Parameter bei Klassenmethoden
Heiko
- javascript
Hallo,
normalerweise lese ich hier nur mit um mir Ideen zu holen, aber heute hab ich auch mal eine Frage.
Ich habe folgendes Problem. Ich hab mir ne Klasse mit ein paar Methoden definiert. Wenn ich eine Methode der Klasse aufrufe, sollen die Parameter, zusammen mit einem in der Klasse definierten String in einem Array gespeichert werden.
Als Beispiel:
(Hier ist der definierte String gleich dem Methodennamen)
var test = new Blubber();
test.moveTo(0,0)
test.click("Ecke");
test.execute();
soll in dem Array stehen:
progarray[0] => 'moveTo(0,0);'
progarray[1] => 'click("Ecke");'
und mit dem Aufruf "execute" sollen dann die Anweisungen ausgeführt werden. Ich hab bis jetzt drumrum programmiert, indem ich für jeden Aufruf eine eigene Funktion geschrieben habe, die das Array füllt.
Das wird aber zu umfangreich. Es muss doch auch gehen, einer Funktion noch einen zusätzlichen Parameter mitzugeben. Ich kriegs aber nicht hin. Ich hab mal den Quelltext dieses einfachen Beispiels mitgeschickt. Es fehlt halt nur der zusätz. Parameter.
function Blubber()
{
this.click = add;//Hier aufruf von add mit zusätz. Parameter "click"
this.moveTo= add;//Hier aufruf von add mit zusätz.Parameter "moveTo"
this.execute = execute;
}
var counter=0;
var progarray = new Array();
function add()
{
var i;
var str = arguments[0] + "(";
for(i=1;i<arguments.length;i++)
{
str += "," + add.arguments[i];
}
str += ");";
progarray[counter]=str;
counter++;
}
function execute()
{
var i;
for(i=0;i<counter;i++)
{
setTimeout(progarray[i],100);
}
}
Ich hoffe es ist verständlich was ich da geschrieben hab und jemand kann mir helfen.
Gruß
Heiko
Moin!
Es ist ganz einfach einer Fuktion einen Parameter zu übergeben!
fuction box(paramter)
{
alert (parameter)
}
Aber schaue mal in SELHTML nach!
<../../tebd.htm#a3>
Dort steht es ausfühlich!
Thilo
natürlich. das is mir schon klar. aber wenn ich in der Klasse den Parameter so übergebe, werden die anderen Parameter nicht übernommen!
Das funktioniert nämlich nicht:
var b = new Blubber;
b.moveTo(0,0);
function Blubber()
{
this.moveTo = add("moveTo");
}
Moin!
Es ist ganz einfach einer Fuktion einen Parameter zu übergeben!
fuction box(paramter)
{
alert (parameter)
}Aber schaue mal in SELHTML nach!
<../../tebd.htm#a3>
Dort steht es ausfühlich!Thilo
Hallo Heiko,
var test = new Blubber();
test.moveTo(0,0)
test.click("Ecke");
test.execute();soll in dem Array stehen:
progarray[0] => 'moveTo(0,0);'
progarray[1] => 'click("Ecke");'
function Blubber()
{
»» this.click = add;//Hier aufruf von add mit zusätz.
Wenn ich Dich richtig verstehe, sind "moveTo" und "click" Funktionen, die Du aufrufen willst, mit wechselnden Parametern. Welche Parameter aktuell sind, soll in dem Array Blubber gespeichert sein?
Dann versuche folgendes:
function Blubber(funkname, arg1, arg2, ... argn)
{ this.funkname = funkname;
this.arg1 = arg1
...
}
var b = new Array();
b[b.length] = new Blubber(); // für jeden Eintrag wiederholen
b[b.length-1].funkname = "moveTo"; // was immer da rein soll
b[b.length-1].arg1 = "(0,0)";
...
function execute()
{ for( i=0;... anzahl Elemente in Blubber )
{ str += b[i].funkname;
str += b[i].arg1;
...}
set timeout ....
}
Nach diesem Muster kannst in Blubber beliebige Aufrufe mit beliebigen Argumenten hinterlegen und mit diesen Daten dann anfangen, was immer Du anfangen willst.
Hoffe Dir geholfen zu haben.
MfG
Günter
Wenn ich Dich richtig verstehe, sind "moveTo" und "click" Funktionen, die Du aufrufen willst, mit wechselnden Parametern. Welche Parameter aktuell sind, soll in dem Array Blubber gespeichert sein?
Ja es sind Funktionen. Die Aufrufe sollen zuerst in einem Array gespeichert und dann ausgeführt werden. Da hilft dein Code auch. Mein Problem ist aber, dass ich die ganzen Klassen gerne in einer externen Datei hätte. Um die Klassen zu benutzen muss man dann nur noch eine Instanz anlegen und die Methoden aufrufen.
der aufruf "klasse.methode(x,y)" soll intern in ein Array gefüllt werden. Das Array wird dann mit "klasse.execute" 'ausgeführt'.
Klar könnte ich auch klasse.add("methode(x,y)") machen. aber dann sind sowas wie unterobjekte auch wieder weg, und das ganze ding wird unhandlich.
ich hab jetzt noch selber rumprobiert und folgende Lösung gefunden, die aber auch nicht optimal ist:
function Blubber()
{
this.click = new Function("add('click('+arguments[0]+','+arguments[1]+');');");
...
}
Hallo Heiko,
(Du magst keine freundlichen Anreden?:))
Ich organisiere das immer so, daß die Funktion mit der Definition der Variablen in eine Datei kommt. Hier blubberF.js und die Daten in eine Zweite Datei, hier: blubberD.js.
Die Anwender können dann direkt über einen Editor oder über komfortable Eingabemasken die erforderlichen Daten eintragen und speichern und neue Instanzen erzeugen.
Über eine Schleife innerhalb des Codes wird dann geschaut, was da ist und entsprechend ausgeführt.
Wenn das kein Modell für Dich ist, kann ich Dir ohne die Abläufe und Inhalte Deiner Anwendung keine weiteren Tips geben.
MfG Günter
Hallo lieber Günter,
(Du magst keine freundlichen Anreden?:))
na doch, bin nur immer so schreibfaul. Aber ich werde mich bessern. s.o. ;-)
Wenn das kein Modell für Dich ist, kann ich Dir ohne die Abläufe und Inhalte Deiner Anwendung keine weiteren Tips geben.
Soweit läuft die Anwendung jetzt auch. Damit soll man so kleine Hilfefilme erzeugen können. Mausbewegen, Klicken, Schreiben usw.
Nur mit Netscape muss ich jetzt noch rumbasteln. Der kennt halt kein document.all und so wird das aufwendig für den Benutzer so ein Hilfefilm zu schreiben. Beim IE hab ich einfach ne Methode mouse.moveToObject(objektname). Und die klappt halt beim Netscape nur wenn man Layer verwendet. Aber dann müsste man um jedes Element einen Layer legen. Is ja nicht sinn der Sache. Ich glaube da kann man aber auch nix weiter machen. wenn jemand dazu eine Idee hat, würde ich mich freuen.
Auf jeden Fall mal vielen Dank für die Hilfe.
Bis denne
Heiko
Hallo Heiko,
Hast Du schon versucht, Dir in jeder Funktion die übergebenen
Parameter per alert() anzeigen zu lassen?
function xyz(parameter){
alert(parameter);
// oder wie bei Dir:
for (k = 0; k < xyz.arguments.length; k++)
argumente = argumente + " " + xyz.arguments[k];
/* ^...hier steht nochmals der Funktionsname.
Ob das nötig ist, weis ich allerdings nicht!
(hab ich aus SELFHTML, weil ich erstmal 'arguments' nachschlagen musste;-)
*/
alert(argumente);
.
.
.
}
Dann hättest Du die Gewissheit, bis wohin Deine Parameter
durchgereicht werden.
AlexBausW
Ich nehme an, Dir wird nicht viel anderes übrigbleiben, als für jede Methode eine eigene Funktion zu definieren, die a) direkt auf den Array zugreift oder b) in eine Eigenschaft des Objekts die Parameter hineinschreibt und dann add startet, daß auf diese Eigenschaft zugreift und den Inhalt an den Array hängt.
Warum eigentlich willst Du für alles eine eigene Methode? Nur eine Funktion add, die dann Parameter bekommt, wäre doch so viel einfacher!
Nun ja, ich nehme an, ich konnte die Notwendigkeit dieses Tricks einfach nicht durchschauen, bin erst ganz kurz im JavaScript-Objekte Selbstdefinier-Business.
Bio