Problem mit Javascript Objekten

andrutz

Mitglied
Hallo alle zusammen,

ich habe ein großes Problem mit Javascript, vielleicht weiß ja einer von euch eine Lösung.

Ich habe hier ein Codebeispiel geschrieben, welches das Problem darstellt.

Wenn ich innerhalb eines Objektes über setTimeout() eine Methode aufrufe, habe ich keinen Zugriff auf die internen Objektvariablen.

Hilfe.

JavaScript
Code:
function object() {
	this.variable = 1;
	
	this.action = action;
	this.action2 = action2;
}

function action() {
	this.variable2 = 2;
	setTimeout(action2, 1000);
}

function action2() {
	alert(this.variable); // undefinied
	alert(this.variable2); //undefinied
}
 
Ich glaube die Funktionen action und action2 sind keine Methoden des Objekts object. Du kannst also nur die Eigenschaften (Variablen) und Methoden (Funktionen) des Objekts abrufen indem du eine Instanz davon erstellst und von der dann die gewünschten Werte abfängst. Bin mir dabei aber nicht so sicher, da ich nicht mehr so genau weiß wie man Funktionen so ein Objekt bindet, dass sie als Methoden dieses Objekts fungieren.
 
Das Problem lag an der fehlenden Klammer hinter action2 in dem Timeout, und dass das this. davor gefehlt hat.
EDIT(In Anknüfpung an einfach nur crack):Ich würde empfehlen Objekt ungefähr wie folgt immer aufzubauen:
HTML:
function object2() {

                function _action() {
                    this.variable2 = 2;
                    setTimeout(this.action2(), 1000);
                }
                function _action2() {
                    alert(this.variable); // undefinied
                    alert(this.variable2); //undefinied
                }
                this.variable = 1;
                this.variable2 = 2;
                this.action = _action;
                this.action2 = _action2;
            }
            var g = new object2();
            g.action();
 
Zuletzt bearbeitet:
Hi,

die Anweisung, die der setTimeout-Methode übergeben wird, wird entweder in Anführungszeichen oder in einer anonymen Funktion übergeben.

In dem Beispiel also
Code:
setTimeout("this.action2()", 1000);

So zeigt this allerdings auf das window-Objekt und nicht auf das gewünschte eigene Objekt.

Deshalb empfehle ich hier die Verwendung einer anonymen Funktion. Die this-Referenz wird zuvor "geclosured".

Beispiel:
Code:
function object2() {
  this.variable = 1;
  this.variable2 = 2;
  this.action = _action;
  this.action2 = _action2;
  this.name = "Objekt";

  function _action() {
    this.variable2 = 3;

    // this-Referenz "closuren"
    var _this = this;
    setTimeout(function(){ _this.action2();}, 1000);
  }

  function _action2() {
  	alert(this.variable); // undefinied
    alert(this.variable2); //undefinied
  }
}

Ciao
Quaese
 
ihr seid ja fit in js, ich hab zwar ewig rumprobiert, aber auf die Lösung wär ich nie gekommen, Danke!

Jetzt noch zu einem anderen Problem mit der gleichen Thematik.

Ich verwende als Framework Prototype.
Ich möchte innerhalb einer Objektmethode asyncron ein PHP Script aufrufen, dass JSON zurückgibt, welches ich dann in this. variablen speichern möchte.

Code Beispiel in js:
Code:
function object() {
	this.variable1 = 1;
	this.variable2 = 2;
	
	this.action1 = _action1;
	this.action2 = _action2;
	
	function _action1() {
		var _this = this;
		var myAjax = new Ajax.Request(
			'./ajax.php',
			{
				method: 'post',
				onSuccess: function(transport) {
					_this.action2(transport);
				}
			}
		);
	}
	
	function _action2(transport) {
		json = transport.responseText.evalJSON();
		this.variable1 = json.test; // überschreibt variable "funktionstüchtig"
		alert(this.variable1); // gibt "funktionstüchtig" aus
	}
}

run = new object();
run.action1();
alert(run.variable1); // hier hat die variable aber wieder den wert 1. HILFE!
 
PHP:
<?
$output = array(
	'test' => 'Funktionst&uuml;chtig'
); 

echo json_encode($output);

?>

EDIT

hat sich erledigt leute, vielen dank!

problem war dass ich alert(run.variable1); aufgerufen habe, bevor run.action1(); die variable asynkron überschreiben konnte.

Vielen Dank für eure Aufmerksamkeit, ihr habtses echt drauf!
 
Versuch mal das:
Code:
...

var run = new object();
run.action1();
alert(run.variable1); // hier hat die variable aber wieder den wert 1. HILFE!
 
Code:
run = new object();
run.action1();

setTimeout("alert(run.variable1)", 5000); // das ist das räzels lösung, jetzt hat run.action1 zeit, run.variable1 zu überschreiben

Vielen Dank
 
Das mit den Objekten und der Vererbung in JavaScript ist ein bisschen tückisch im vergleich zu anderen Sprachen von denen man OOP gewohnt ist.

Ein kleiner überblick über JavaScript-Objekte mit Beispielen findest du
hier.

Bzgl. Vererbung und Prototypin' gibts natürlich auch etwas.

lg Samuel
 

Neue Beiträge

Zurück