Liebe Kristin,
das Schlüsselwort "this" deutet nicht immer auf das Objekt, das Du in Deinem Code vermutest.
Wenn Du in einem XHR-Objekt (XmlHttpRequest-Objekt) einen Eventhandler (also die Funktion/Methode onreadystatechange) nutzt, dann deutet "this" in dieser Funktion immer auf das XHR-Objekt, keinesfalls jedoch auf dasjenige Objekt (eine Instanz von "Test"), dessen Methode "test1" dieses XHR-Objekt definiert hat.
xmlRequest = (window.XMLHttpRequest) ? new XMLHttpRequest() : ((window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : false);
xmlRequest.open('GET', url, true);
Hier definierst Du ein XHR-Objekt namens xmlRequest. Soweit OK.
this.delEntries(obj);
Hier rufst Du eine Methode der Instanz des "Test"-Objektes auf, nämlich "delEntries".
xmlRequest.onreadystatechange = function(){
...
this.test2(obj);
}
So. Hier definierst Du eine anonyme Funktion, die Du dem Eventhandler des XHR-Events als Wert zuweist. Immer wenn dieser ausgeführt wird, dann zeigt "this" auf das XHR-Objekt, dessen Eventhandler gefeuert hat - logisch oder? Wie sonst sollte denn JavaScript wissen, welches XHR-Objekt (dessen könntest Du mehrere instanziiert haben!) denn nun diesen ReadyStateChange hatte?
Man löst solche Dinge zum Beispiel mit einer "Closure", indem man eine lokale Variable definiert, um dann in einer Funktion, die "unterhalb" des aktuellen Geltungsbereiches definiert wird, darauf zurückgreift.
var Test = function () {
this.test1 = function () {
var xmlRequest = new XMLHttpRequest(); // ich kürze hier ab!
var t = this; // diese Variablen wird nachher benötigt
xmlRequest.onreadystatechange = function () {
// tu was...
t.test2(); // t verweist auf die Instanz von "Test"
// "t" ist deshalb hier bekannt, da diese anonyme Funktion
// im Geltungsbereich von "this.test1" definiert wird, und
// damit auf die lokalen Variablen von "this.test1" zugreifen
// kann.
};
};
};
Liebe Grüße,
Felix Riesterer.
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)