auf interne Variable zugreifen
derletztekick
- javascript
Hallo,
ich versuche auf eine "Klassenvariable" in einer Funktion zu zugreifen - erfolglos, wie Ihr Euch sicher denken könnt ;-)
Zunächst ein Beispiel, damit mein kleines Problem klarer wird:
<a href="#">foo</a>
<script type="text/javascript">
function myClass(a,b) {
this.a = a;
this.b = b;
this.l = document.getElementsByTagName("a")[0];
this.l.onclick = function() { window.alert(myClass.a); return false;};
}
var obj = new myClass(3,4);
</script>
in der onclick-Funktion möchte ich gern auf die Varable "a" zu greifen und diese manipulieren. Wie kann ich dies tun?
Ferner habe ich noch eine Frage zu der Methode delete
und (dem aktuellen) Firefox. Kann es sein, das es immernoch nicht möglich ist, ein Objekt zu löschen, wenn dies mit var
deklariert wurde?
var obj = new Object();
delete obj;
window.alert(typeof(obj));
Vielen Dank für Eure Hilfe!
Mit freundlichem Gruß
Micha
hi,
this.l.onclick = function() { window.alert(myClass.a); return
in der onclick-Funktion möchte ich gern auf die Varable "a" zu greifen und diese manipulieren. Wie kann ich dies tun?
Da dein Objekt den Namen obj trägt, über obj.a - aber dieser unflexible und auf diese eine Objektinstanz beschränkte Weg ist sicherlich nicht das, was du willst.
Du könntest beispielsweise dein Objekt bei der Erstellung an den Link binden - und dann über this in der Funktion auf diesen zugreifen.
function myClass(a,b) {
this.a = a;
this.b = b;
this.l = document.getElementsByTagName("a")[0];
this.l.Instanz = this;
this.l.onclick = function() { window.alert(this.Instanz.a); return false;};
}
gruß,
wahsaga
Hallo wahsaga,
dieser unflexible und auf diese eine Objektinstanz beschränkte Weg ist sicherlich nicht das, was du willst.
Hätte in meinem Fall vermutlich bereits ausgereicht, da ich ein Spiel neu starten lassen möchte (dabei wird der selbe Objektname natürlich erneut vergeben). Problem an sich war ein (so vermute ich zumindest) nicht entferntes setInterval(), das den vorzeitigen Neustart "überlebte" und dann munter weiter lief...
Folglich liefen zwei Intervalle beim neuen Spiel.
Ich habe mich trotzdem für Deine allg. gültige Lösung entschieden, da ich damit mein zweites Problem (delete) vermutlich auch im FF über eine Methode lösen konnte:
function destroyObj(Obj){
if (typeof(Obj) == "object"){
clearInterval(Obj.interval);
Obj.interval = null;
//Obj = null;
delete Obj;
}
}
der Aufruf erfolgt über destroyObj(FootNewGameCell.Instanz);
. Ein typeof(obj) zeigt, das Obj nicht mehr bekannt ist.
Vielen Dank!
Mit freundlichem Gruß
Micha
function destroyObj(Obj){
if (typeof(Obj) == "object"){
clearInterval(Obj.interval);
Obj.interval = null;
//Obj = null;
delete Obj;
}
}
Ich durchschau dein code nicht ganz, aber dass macht aber einen Merkwürdigen Eindruck. Wenn ich das ganze richtig sehe, versuchst du ein Objekt innerhalb einer Objektmethode zu zerstören. Das kann eigentlich nicht gut gehen.
Letztlich ist das auch nicht besonders OO, wenn du das Spiel für einen Neustart erst zerstörst und dann neu anlegst. Sinnvoller wäre es einfach eine Methode end() und start() zu implementieren.
Struppi.
--
[Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
Hallo Struppi,
Ich durchschau dein code nicht ganz, aber dass macht aber einen Merkwürdigen Eindruck. Wenn ich das ganze richtig sehe, versuchst du ein Objekt innerhalb einer Objektmethode zu zerstören. Das kann eigentlich nicht gut gehen.
Scheint aber in allen von mir getesteten Browsern zu gehen, wobei das delete nicht nötig ist. Grund ist, dass das Spiel (ein simples Tetris) beim laden der Seite startet. Diese Methode nutze ich dann beim Neustart auch und wollte hier nicht extra was neues machen, da es schon was (funktionierendes) gibt...
Letztlich ist das auch nicht besonders OO, wenn du das Spiel für einen Neustart erst zerstörst und dann neu anlegst.
Ich habe auch erst kürzlich angefangen, ein wenig OOP in JS zu betreiben, da kann ich über diesen Mißstand noch lächelnd hinwegsehen. Ich tue mich da immer etwas schwer und wenn Du Dir das Script ansiehst, wirst Du sicher einige (viele?) Verbesserungsvorschläge haben für mich. Letztlich ist es schneller, alles zu entfernen als:
einfach eine Methode end() und start() zu implementieren.
um das Brett zu räumen.
Mit freundlichem Gruß
Micha
Ferner habe ich noch eine Frage zu der Methode
delete
und (dem aktuellen) Firefox. Kann es sein, das es immernoch nicht möglich ist, ein Objekt zu löschen, wenn dies mitvar
deklariert wurde?
Ja.
delete obj;
du kannst den Erfolg von delete auch testen:
alert(delete obj);
sollte false ergeben.
Struppi.
Hallo derletztekick,
delete löscht keine Objekte, sondern Variable.
Wenn man schreibt:
var x = new Array(...);
var y = x;
delte x;
dann existiert nach dem delete das Array-Objekt weiter, denn es gibt noch eine Referenz darauf, nämlich durch die Variable y; die Variable x ist danach undefined.
Erst wenn
delete y;
ausgeführt wird, wird das Array-Objekt als _Nebeneffekt_ zerstört.
Warum?
'Delete y' löscht die Variable y, was implizit den Referenzzähler des Array-Objektes auf 0 herunter zählt. Wenn der Referenzzähler eines Objektes 0 erreicht hat, wird es automatisch zerstört.
Gruß,
Houyhnhnm
delete löscht keine Objekte, sondern Variable.
Unsinn
http://de.selfhtml.org/javascript/sprache/operatoren.htm#delete
http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/ops.html#1045837
Wenn man schreibt:
var x = new Array(...);
var y = x;
delte x;dann existiert nach dem delete das Array-Objekt weiter, denn es gibt noch eine Referenz darauf, nämlich durch die Variable y; die Variable x ist danach undefined.
In welchem Browser hast du das getestet?
Bei mir ist das weder im IE noch FF so.
Struppi.