setTimeout -> classen.methode aufrufen
T-Rex
- javascript
Hallo
:( meine Javascript Sonderwünsche reißen heute nicht ab.
Ich hab ein window.setTimeout, welches ich von der Logik her so aufrufen möchte:
window.setTimeout(this.funktion(),1000);
Das funktioniert ja nicht, weil die methode "funktion()" in setTimeout definiert ist. Deshalb habe ich es im Moment so gemacht:
--------
var Objekt = new Klasse()
...
window.setTimeout(Objekt.funktion(),1000);
--------
Das ist natürlich total dämlich, da ich somit nur eine Instanz mit der Klasse erzeugen kann.
Das gleiche Problem ab ich noch an einer anderen Stelle wo über einen mouseover Effekt ebenfalls eine Klassen Methode aufgerufen werden soll.
----------
this.load = function(element)
{
element.onmousemove = Objekt.move;
}
----------
Ich steh völlig auf dem Schlauch, wie ich das lösen könnte.
Danke
T-Rex
Hallo,
window.setTimeout(this.funktion(),1000);
element.onmousemove = Objekt.move;
Die Frage kam hier schon öfters, dazu findest du einiges im Forumsarchiv und in diesem Artikel:
Methoden in anderen Kontexten ausführen
Übrigens ist window.setTimeout(this.funktion(), ...) Unsinn, weil es die Methode sofort aufruft, nicht verzögert. Man müsste wie bei der Zuweisung von Event-Handlern das Funktionsobjekt übergeben, nicht den Rückgabewert des Aufrufs.
Mathias
Hallo,
window.setTimeout(this.funktion(),1000);
element.onmousemove = Objekt.move;Die Frage kam hier schon öfters, dazu findest du einiges im Forumsarchiv und in diesem Artikel:
Methoden in anderen Kontexten ausführen
Übrigens ist window.setTimeout(this.funktion(), ...) Unsinn, weil es die Methode sofort aufruft, nicht verzögert. Man müsste wie bei der Zuweisung von Event-Handlern das Funktionsobjekt übergeben, nicht den Rückgabewert des Aufrufs.
Mathias
Danke für deine Antwort!
Leider beschreibt der Link genau das was ich nicht möchte.
Es wurde ein Objekt erstellt und das wird explizit in der Methode verwendet.
Eine Bildliche Veranschaulichung einer Klasse, wird immer der Stempel hergenommen. Mit der Zeile var Objekt = new Objekt(); wird also einmal gestempelt und man hat ein neues "was auch immer". Als Beispiel wird immer sehr gerne das Auto herbeigezogen. Man Stempelt einmal und hat eine Karosserie. Dann kann man über methoden gas geben oder über Eigenschaften die Farbe ändern. Das tolle dabei ist der Konstruktor. Dem kann man beim stempeln sagen "du bist ein Golf" oder sowas.
Wenn man in der Klasse den expliziten Namen des Objektes angibt, macht es nur Sinn einmal zu stempeln. Anschließend muss man mit Objekt methoden versuchen nachträglich die Zustände hin zu pfuschen. Eine Datenkapselung ist somit nicht mehr im eigentlichen Sinne möglich.
Das ganze jetzt an meinem Praktischem Beispiel. Ich möchte einen Stempel erstellen der ein Konstrukt aus Divs mit vordefinierten Eigenschaften erstellen. Sprich Wenn ich einmal Stempel und dem Stemepl sage "du bist grün" dann wird ein grünes Objekt-Div erstellt. Dann kann ich noch ein blaues Stempeln etc...
Natürlich bleibt es nicht bei der Farbe.
Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt!?
Gruß
T-Rex
Hallo,
Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt!?
Ok, was ist deine Frage? Werd mal konkreter: Was hast du schon programmiert, wo hapert es und was würdest du gerne verbessern?
Was meinst du mit:
Eine Datenkapselung ist somit nicht mehr im eigentlichen Sinne möglich.
Vom Modell her kannst du es so lösen (wie du auch beschreibst):
var instanz = new K;
instanz.setzeEigenschaftA("wert");
instanz.setzeEigenschaftB("wert");
instanz.setzeEigenschaftC("wert");
instanz.start(); // Falls nötig.
Oder du übergibst dem Konstruktor die Werte als Parameter, z.B. in einem Object:
var instanz = new K(
{
a : "wert",
b : "wert",
c : "wert",
}
);
In K nimmst du den Parameter entgegen und kannst über parameter.a usw. schauen, ob Eigenschaften übermittelt wurden oder nicht.
Je nachdem, was du vorhast, sind natürlich noch weitere Lösungen möglich.
Das jetzt mal ins Blaue hinein.
Mathias
Also in meinem Anfangspost hab ich denke ich ziemlich gut beschrieben was ich habe und was ich will.
Im Moment habe ich window.setTimeout(Objekt.methode(),1000);
Wenn das Objekt jedoch nicht mehr Objekt heißen soll, sondern tkejbO wird es einen Fehler geben, da in der Klasse selber Hardcodiert window.setTimeout(Objekt.methode(),1000); steht. Ergo kann ich nur eine Instanz von dieser Klasser erzeugen, nämlich "Objekt".
eventuell noch mal ein wenig mehr Code, ich hoffe dann wird es deutlicher:
--------------------
var Klasse()
{
var this.methode = function()
{
window.setTimeout(Objekt.methode2(),1000);
}
var this.methode2 = function()
{
irgendwas...;
}
}
var Objekt = new Klasse();
--------------------
Demnach ist es bei settimeout wichtig wie das Objekt heißt (nämlich Objekt). Wenn folgender Code funktionieren würde: window.setTimeout(this.methode2(),1000); dann wäre es egal wie das Objekt heißt, dann könnte das Objekt auch "toll" heißen, es würde trotzdem funktionieren.
MFG
T-Rex
Demnach ist es bei settimeout wichtig wie das Objekt heißt (nämlich Objekt).
Nein, du musst die Methode im richtigen Kontext ausführen.
function Klasse (){
var self = this;
this.methode = function(){
window.setTimeout(self.methode2,1000);
};
this.methode2 = function(){
/*/*
};
}
var Objekt = new Klasse();
Die vars in deinem Quelltext sind überflüssig und eigentlich falsch, man deklariert keine Attribute mit var
Struppi.
Hallo,
Also in meinem Anfangspost hab ich denke ich ziemlich gut beschrieben was ich habe und was ich will.
In meinem Anfangspost habe ich denke ich ziemlich gut eine Lösung geboten.
Wenn folgender Code funktionieren würde: window.setTimeout(this.methode2(),1000); dann wäre es egal wie das Objekt heißt, dann könnte das Objekt auch "toll" heißen, es würde trotzdem funktionieren.
Bitte lies doch den verlinkten Artikel. Das ist offensichtlich genau das, was du suchst.
Mathias
Hallo,
Also in meinem Anfangspost hab ich denke ich ziemlich gut beschrieben was ich habe und was ich will.
In meinem Anfangspost habe ich denke ich ziemlich gut eine Lösung geboten.
Wenn folgender Code funktionieren würde: window.setTimeout(this.methode2(),1000); dann wäre es egal wie das Objekt heißt, dann könnte das Objekt auch "toll" heißen, es würde trotzdem funktionieren.
Bitte lies doch den verlinkten Artikel. Das ist offensichtlich genau das, was du suchst.
Mathias
Was Struppi gepostet hat ist die Lösung!!
Da kann man noch 1000 mal deinen Link durchlesen, diese Lösung in dem Link ist Scheisse, da man nur eine Instanz der Klasse aufrufen kann. Und genau das ist ja das Problem!!
Mit Struppies Lösung ist es zwar etwas gepfuscht, aber wenigstens bin ich vom Namen her frei :).
DANKE Gott Lob eine Lösung DANKE!!
T-Rex
Hallo,
Da kann man noch 1000 mal deinen Link durchlesen
Du hast ihn nichtmal einmal aufmerksam gelesen.
Was Struppi gepostet hat ist die Lösung!!
diese Lösung in dem Link ist Scheisse
Man, der Artikel erklärt die Lösung, die Struppi gepostet hat.
da man nur eine Instanz der Klasse aufrufen kann.
Die Stelle, die ich verlinkt habe, erklärt erstmal das Problem. Den Artikel solltest du über den verlinkten Abschnitt hinaus lesen - und vor allem verstehen.
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#methoden-eigener-objekte-und-kontext
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#closures
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#alternativen-kontext
Wenn du meine Hilfe nicht willst, bitte, ich dränge mich nicht auf.
Mathias
Hallo,
Da kann man noch 1000 mal deinen Link durchlesen
Du hast ihn nichtmal einmal aufmerksam gelesen.
Was Struppi gepostet hat ist die Lösung!!
diese Lösung in dem Link ist ScheisseMan, der Artikel erklärt die Lösung, die Struppi gepostet hat.
da man nur eine Instanz der Klasse aufrufen kann.
Die Stelle, die ich verlinkt habe, erklärt erstmal das Problem. Den Artikel solltest du über den verlinkten Abschnitt hinaus lesen - und vor allem verstehen.
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#methoden-eigener-objekte-und-kontext
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#closures
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#alternativen-kontextWenn du meine Hilfe nicht willst, bitte, ich dränge mich nicht auf.
Mathias
Argh wie peinlich...:(.
Hab bei dem Link von oben bis zu dem Container Zeugs alles gelesen. Danach stand der große Punkt "Objekten selbst machen" oder so und denn hab ich nur mal überflogen.
Der Link wäre natürlich die Lösung gewesen :(, man fühle ich mich jetzt doof, naja Hauptsache meine west-deutsche arrogante Klappe aufgerissen :D.
Mit unter einem ganz kleinem Hut versteckten Grüßen
T-Rex
Hi,
Im Moment habe ich window.setTimeout(Objekt.methode(),1000);
und das ist äquivalent zu:
var temp = Objekt.methode();
window.setTimeout(temp, 1000);
Möchtest Du tatsächlich die _Rückgabe_ der Methode zeitverzögert ausführen?
eventuell noch mal ein wenig mehr Code, ich hoffe dann wird es deutlicher:
Sagen wir, es festigt sich das Bild, dass molily von Anfang an die richtige Richtung gewiesen hat.
Cheatah
Hi,
Im Moment habe ich window.setTimeout(Objekt.methode(),1000);
und das ist äquivalent zu:
var temp = Objekt.methode();
window.setTimeout(temp, 1000);Möchtest Du tatsächlich die _Rückgabe_ der Methode zeitverzögert ausführen?
eventuell noch mal ein wenig mehr Code, ich hoffe dann wird es deutlicher:
Sagen wir, es festigt sich das Bild, dass molily von Anfang an die richtige Richtung gewiesen hat.
Cheatah
Auch wenn man Objekt.methode(); in noch so viele Variablen schmeisst, es bleibt das Problem, dass man nur eine Instanz der Klasse aufrufen kann und zwar "Objekt".
MFG T-Rex