Public-Funktion aus der Klasse aufrufen
Jan-Philipp
- javascript
0 wahsaga0 Jan-Philipp0 molily
1 molily
0 Cybaer
Hallo,
Ich habe in einer Klasse eine Funktion (clearBuffer) definiert die sowohl aus der Klasse heraus als auch von 'außen' aufgerufen werden soll. Das Problem ist, dass die Funktion entweder nur von außen oder nur aus der Klasse heraus aufrufbar ist - nie aber beides. Ich habe auch schon viel mit der Syntax
httpRequest.prototype.clearBuffer = function()
{ alert( 'clearBuffer' );
}
herumexperimentiert, aber auch damit klappt es nicht.
Behelfsweise habe ich die Variable 'self' eingebaut in die ich im Konstruktor 'this' kopiere. Über diese Variable lässt sich die public-Funktion dann auch aus der Klasse heraus aufrufen, aber warum geht es nicht auch ohne diese Variable ?
Hier das Listing. Der problemhafte Aufruf ist in der letzten Zeile des Script-Blockes:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<title>Test</title>
<script type="text/javascript" language="JavaScript">
<!--
function init()
{ // Neues Objekt erstellen
httpReq = new httpRequest();
// Aufruf der öffentlichen Funktion
httpReq.clearBuffer( 'init()' );
// Aufruf der Öffentlichen Funktion
httpReq.requestData();
}
// Konstruktor
function httpRequest()
{ // privates HTTP-Objekt
var xmlHttp;
var self = this;
// Öffentliche Funktion
this.clearBuffer = function( strFunctionName )
{ alert( 'Funktion clearBuffer. Aufgerufen aus Funktion: ' + strFunctionName );
}
// Aufruf der öffentlichen Funktion aus dem Konstruktor
this.clearBuffer( 'httpRequest()-Constructor' );
// Öffentliche Funktion
this.requestData = function()
{ try
{ if( window.ActiveXObject )
xmlHttp = new ActiveXObject( 'Microsoft.XMLHTTP' );
else if( window.XMLHttpRequest )
xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = onData;
xmlHttp.open( "GET", 'Anfrage', true );
xmlHttp.send( null );
}
catch( excNotLoadable )
{ alert('Kein bekannter Browser');
} }
// Private Funktion
function onData()
{ if(( xmlHttp.readyState == 4 )&&( xmlHttp.status == 200 ))
{ // Aufruf der öffentlichen Funktion über 'this'
self.clearBuffer( 'readData()' );
// Aufruf der öffentlichen Funktion. Klappt nicht!!!
clearBuffer( 'readData()' );
} } }
//-->
</script>
</head>
<body onLoad="init()">
</body>
</html>
Gruß
Jan-Philipp
hi,
// Konstruktor
function httpRequest()
...
// Öffentliche Funktion
this.clearBuffer = function( strFunctionName )
// Aufruf der öffentlichen Funktion. Klappt nicht!!!
clearBuffer( 'readData()' );
Du hast this.clearBuffer definiert - warum rufst du dann nicht auch this.clearBuffer auf?
Als eine große Hilfe beim Verstehen von private/privileged/public Eigenschaften/Methoden empfand ich die Seite OOP in JS, Part 1 : Public/Private Variables and Methods
gruß,
wahsaga
Du hast this.clearBuffer definiert - warum rufst du dann nicht auch this.clearBuffer auf?
Wenn ich this.clearBuffer aufrufe klappt es auch nicht. 'this' bezieht sich ja in der onData-Funktion auf die Funktion selbst, also onData.clearBuffer() - und diese Funktion gibt es ja nicht.
Gruß
Jan-Philipp
Hallo,
Wenn ich this.clearBuffer aufrufe klappt es auch nicht. 'this' bezieht sich ja in der onData-Funktion auf die Funktion selbst
Nein! this bezieht sich *nie* auf die Funktion selbst, sondern auf das Objekt, in dessen Kontext die Funktion (als Methode) ausgeführt wurde. Das ist, sofern man nicht nachhilft, i.d.R. das Objekt, an dem das Funktionsobjekt als Unterobjekt dranhängt. Gibt es kein solches Elternobjekt, ist der Kontext der globale Kontext und this zeigt auf window.
(Vereinfacht und zusammengefasst - ist wahrscheinlich nicht wasserdicht formuliert.)
Mathias
Ahja, verstanden. Also liegt das ganze 'Problem' eigentlich daran das zwischendurch ein Ereignis aufgerufen wird wodurch der Kontext flöten geht. Ohne diesen Ereignis-Aufruf müsste es demnach dann ja klappen.
Dann ist die Methode mit der self-Variable wohl die sauberste Lösung.
Danke!
Hallo,
Ich habe in einer Klasse eine Funktion (clearBuffer) definiert die sowohl aus der Klasse heraus als auch von 'außen' aufgerufen werden soll. Das Problem ist, dass die Funktion entweder nur von außen oder nur aus der Klasse heraus aufrufbar ist - nie aber beides.
Doch, aber natürlich ist die Ansprechweise eine unterschiedliche.
Von »innerhalb«: this.methode()
Von »außerhalb«: Instanzname.methode()
Ein Problem gibt es nun bei Methoden, die zwar an der Instanz hängen bzw. im Konstruktor definiert wurden, aber tatsächlich nicht im Kontext der Instanz ausgeführt werden, sodass es kein Ansprechen »von innen« mehr ist.
Behelfsweise habe ich die Variable 'self' eingebaut in die ich im Konstruktor 'this' kopiere. Über diese Variable lässt sich die public-Funktion dann auch aus der Klasse heraus aufrufen, aber warum geht es nicht auch ohne diese Variable ?
Der readystatechange-Handler wird nicht im Kontext deiner httpRequest-Instanz ausgeführt, sondern im globalen Kontext. this zeigt also nicht auf deine Instanz, sondern auf window.
// Private Funktion
function onData()
onData wird zeitversetzt (»asynchron«) als readystatechange-Handler ausgeführt und hat damit die Verbindung zur Objektinstanz verloren, wenn mit »var self = this;« die Referenz nicht in die Funktion hinein vererbt hättest.
{ if(( xmlHttp.readyState == 4 )&&( xmlHttp.status == 200 ))
{ // Aufruf der öffentlichen Funktion über 'this'
self.clearBuffer( 'readData()' );
Das ist eine Möglichkeit, auf die Instanz zuzugreifen.
// Aufruf der öffentlichen Funktion. Klappt nicht!!!
clearBuffer( 'readData()' );
Hier hingegen wird letztlich window.clearBuffer() aufgerufen, und die Funktion gibt es nicht.
Was genau ist nun deine Frage? Du hast offenbar schon eine Lösungsmöglichkeit gefunden. Es gibt noch weitere andere Möglichkeiten, dazu empfehle ich dir diesen Artikel.
Mathias
Hi,
bitte unterlaß Crosspostings parallel in verschiedenen Foren. So etwas wird generell als unhöflich (um nicht zu sagen: unverschämt) angesehen.
Gruß, Cybaer
Tschuldigung, wusst ich nicht. Kommt nicht wieder vor.