public Variable aus Klasse zurückgeben

  • Themenstarter Themenstarter crash_override
  • Beginndatum Beginndatum
C

crash_override

Hallo.
Ich hab da ein problem bei OOP in JavaScript. Ich hab schon überall nach einer Lösung gesucht, allerdings weiß ich nicht wie man das Problem formuliert und bin deswegen noch auf nichts brauchbares gekommen.

Ich habe folgenden Code:

Code:
var Kugel = function() {

this.variable = null;

this.setzen() {
 this.variable = "Die Kugel rollt";
}

this.ausgeben() {
 return this.variable;
}

}

Dann das ganze so aufrufen:

Code:
 var Kugel = new Kugel();
Kugel.setzen()
var ausgabe = Kugel.ausgeben();
alert(ausgeben);

Ich ging davon aus, dass alert nun den davor gesetzten Wert "Die Kugel rollt" ausgibt, stattdessen kommt nur "null". Was muss ich denn machen, damit das so funktioniert dass der aktuell zugewiesene Wert von this.variable ausgegeben wird ?

mfg, crash_override.
 
1. Ich wundere mich, dass überhaupt eine Ausgabe kommt. Bei mir meldete die Fehlerkonsole

Error: missing ; before statement
Source Code:
this.setzen() {

Es muss heißen

Javascript:
var Kugel = function() {
	this.variable = null;
	
	this.setzen = function() {
		this.variable = "Die Kugel rollt";
	}
	
	this.ausgeben = function() {
		return this.variable;
	}
}

2. Du legst die Variable "ausgabe" fest. Aber im alert steht "ausgeben"

3. Du solltest die Variable nicht ebenfalls "Kugel" nennen. Denn "Kugel" heißt bereits die Klasse.

Edit:
Hier noch der endgültige Code

Javascript:
function Kugel() {
	this.variable = null;
	
	this.setzen = function() {
		this.variable = "Die Kugel rollt";
	}
	
	this.ausgeben = function() {
		return this.variable;
	}
}

var foo = new Kugel();
foo.setzen()
var ausgabe = foo.ausgeben();
alert(ausgabe);
 
Danke für die Antwort. Sorry, den Code habe ich nur beispielhaft eben hingecodet, hab die functions wohl vergessen ^^"
Ich wollte nur wissen ob das so geht wie ich das da hingetippt habe, denn in der eigentlichen Klasse klappts so nicht.

Es ist eine Ajax-Klasse, die ich mal irgendwo von einem Tutorial übernommen habe und die wollte ich jetzt ein wenig erweitern:

Javascript:
var ajaxRequest = function(u, id, m, s)
{
	this.url		= u;
	this.method		= m || "GET";
	this.async		= s || true;
	this.body		= null;
	this.head		= false;
	this.out        = "";
	this.id         = id || null;
	this.msg        = null;
	
	var _this = this;
	
	//------------------------------------------------------------
	try {
		this.request = new XMLHttpRequest();	
	}catch(e){
		try {
			this.request = new ActiveXObject("Microsoft.XMLHTTP");
		}catch(e){
			this.request = false;	
		}
	}
	
	//------------------------------------------------------------
	this.doRequest = function()
	{
		if(!this.url)
		{
			this.onError("keine URL gesetzt");
			return false;
		}
		if(!this.method)
		{
			this.method = "GET";
		}else{
			this.method = this.method.toUpperCase();
		}
		if(!this.request)
		{
			this.onError("kein Verbindungsobjekt gesetzt");
			return false;
		}
		
		this.request.open(this.method, this.url, this.async);
		
		if(this.method == "POST")
		{
			this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
		}
		if(this.head)
		{
			for(var i=0; i<this.head.length; i+=2)
			{
				this.request.setRequestHeader(this.head[i], this.head[i+1]);
			}
		}
		this.request.onreadystatechange = this.checkState;
		this.autosave(this.id);
		this.request.send(this.body);
	}
	
	//------------------------------------------------------------
	this.onSuccess = function(txt, xml)
	{	
		this.msg = txt;
	}
	
	//------------------------------------------------------------
	this.onError = function(msg)
	{
		alert(23);
		alert("Fehler: "+msg);
	}
	
	//------------------------------------------------------------
	this.checkState = function()
	{
		if(_this.request.readyState<4)
		{
			return false;
		}
		if(_this.request.status==200 || _this.request.status == 304)
		{
			_this.onSuccess(_this.request.responseText, _this.request.responseXML);
		}
		else
		{
			_this.onError("Fehler bei der Datenuebertragung");
		}
	}
	
	// -----------------------------------------------------------
	this.urlencode = function(str)
	{
	  var code = "";
      for (var i = 0; i < str.length; i++) {
      if (str.charAt(i) == " ") {
       code += "+";
      } else if (str.charAt(i) == "+") {
       code += "%2B";
      } else if (str.charCodeAt(i) > 127) {
       code += encodeURI(str.charAt(i));
      } else {
       code += escape(str.charAt(i));
      }
     }
     return code; 
	}
	
	// -----------------------------------------------------------	
	this.autosave = function(formid) 
	{
	  var form = document.getElementById(formid);
	  var serialized_form = "";
      for (var i = 0; i < form.elements.length; i++) {
      if (!form.elements[i].disabled) {
       serialized_form += this.urlencode(form.elements[i].name) + "=" + this.urlencode(form.elements[i].value);
       serialized_form += "&";
      }
	 } serialized_form = serialized_form.substring(0, serialized_form.length-1);
	  this.body = serialized_form;
	}
	
	// -----------------------------------------------------------
	this.getMsg = function()
	{ 
	 return this.msg;
	}
}

Mein Ziel war, den Response-Text der Datei, die ich ich per Ajax lade, per return im Object getMsg() zurückzugeben, damit ich die auf der eigentlichen Seite weiter verarbeiten kann.

Javascript:
var insertGb = function() {
	    var ajax = new ajaxRequest('modules/gbEntry.php', 'gbEntry', 'POST');
		ajax.doRequest()
		var output = ajax.msg();
		alert(output); 
	    }

Leider kommt halt nur "null" zurück.
 
Der Klassiker.
AJAX ist asynchron. Du kommst an "msg" erst ran, nach dem der Server die Antwort gesendet hat.
Auf Anhieb sehe ich aber in der gezeigten Klasse keine Möglichkeit eine Callback-Funktion zu übergeben, womit sie für AJAX eigentlich wertlos ist. Wenn du dem Konstruktor als letzten (vierten) Parameter noch ein "false" mitgibst, funktioniert es zumindest so, wie du es willst, aber synchrone Anfragen blockieren alles weitere.
 
Hm, das ist blöd. Ich habe durch ein wenig Rumprobieren auch herausgefunden, dass das Objekt getMsg() aufgerufen wird BEVOR die Klasse in das Objekt onSuccess() kommt. Nun weiß ich auch, warum xD

Ich denke ich werde das wohl so lösen, dass ich in onSuccess() halt den entsprechenden Code reinschreibe. Dadurch ist die Klasse nur für die eine Webseite zu gebrauchen und muss jedesmal umgeschrieben werden. Oder ich schreibe fürs nächste Mal eine neue Klasse die das besser macht ^^

Vielen Dank für die Bemühungen.
 
Zurück