peterS.: selbstreferenzierung von js-objekten

Beitrag lesen

gruss wiberg,

function move() {
  document.getElementById(this.posx).style.color = "#" + this.color;
  window.setTimeout("this.move();",this.speed);

-----------------------^^^^^^^^^^^^^^

spaetestens an dieser stelle ist der interpreter ueberfordert, da "this.move();"
   von der funktion "setTimeout" nicht mehr im richtigen kontext evaluiert werden
   kann oder einfacher ausgedrueckt: "setTimeout" kann "this.move()" nirgendwohin
   zuordnen, da "this" als zeichenkette innerhalb von "setTimeout" nicht mehr den
   bezug zur methode "move" aufrechterhalten kann;

}

es muss also ein weg gefunden werden, der die referenz auf das objekt trotz der
   gerade beschriebenen einschraenkungen durch "setTimeout" permanent ermoeglicht;

zur veranschaulichung schlage ich ersteinmal die "unsaubere" loesung vor, mit
   namen von globalen variablen zu arbeiten; jedes objekt, welches spaeter die
   "move"-methode aufrufen soll, benoetigt eine zusaetzliche eigenschaft, in der
   sein globaler variablenname hinterlegt wird;

dieser name wird dann beim erstmaligen aufruf der methode mitgegeben und von
   ebenjener dann permanent durchgeschliffen;

dein abgewandeltes bsp.:

function Sn(color) {
   //this.posx = Math.floor(size/2);
     this.color = color;
     this.move = move;
   }
   function move(globalName,objectSpeed) {
   //document.getElementById(this.posx).style.color = "#" + this.color;
     alert("color = " + window[globalName].color + "\nspeed = " + objectSpeed);
     window.setTimeout(("window["" + globalName + ""].move("" + globalName + ""," + objectSpeed + ")"),objectSpeed);
   }
   var x = new Sn("ffcc00");

x.globalName = "x";
   x.speed = 3000;

x.move(x.globalName,x.speed);

ausserdem ist es ratsam, eigenschaften und methoden, die allen instanzen eines
   konstruktors gemein sind, als prototypen der konstruktor-funktion zu realisieren -

fuer den oben beschriebenen fall saehe das so aus:

var Sn = function(color) {
   //this.posx = Math.floor(size/2);
     this.color = color;
   };
   Sn.prototype.move = function(globalName,objectSpeed) {
   //document.getElementById(this.posx).style.color = "#" + this.color;
     alert("color = " + window[globalName].color + "\nspeed = " + objectSpeed);
     window.setTimeout(("window["" + globalName + ""].move("" + globalName + ""," + objectSpeed + ")"),objectSpeed);
   };
   Sn.prototype.speed = 3000; // time in msec;

var x = new Sn("ffcc00");

x.globalName = "x";

x.move(x.globalName,x.speed);

falls jetzt noch interesse an einem dieses thema ausfuehrlich diskutierenden
   und beschreibenden thread besteht, empfehle ich als einstieg folgendes posting -

http://forum.de.selfhtml.org/archiv/2004/3/77173/#m445704 - sowie die

dort verlinkte javascript-loesung:

http://www.pseliger.de/jsExtendedApi/jsApi.Object.selfReferences.dev.js

viel erfolg - peterS. - pseliger@gmx.net

--
sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)