peterS.: selbstreferenzierung von js-objekten

Beitrag lesen

gruss Jürgen,

Also wie im Eröffnungsposting;
...
...
aber offensichtlich geht so etwas nicht.
Daher die "schlechte" Lösung:
function test(name) {
alert(name);
}
und
ABC=new test("ABC");

naja, selbst wenn diese loesung "schlecht" sein sollte, so
   ist sie doch legitim - das hab' ich doch weiter oben schon
   so ge- und beschrieben;

es gibt aber dennoch eine moeglichkeit, das "referenzloch"
   zwischen einem js-objekt und dem zugriff auf dieses objekt
   oder auf eine seiner eigenschaften bzw. dem aufruf einer
   seiner methoden aus einer dynamisch geschriebenen client-
   oberflaeche heraus elegant zu ueberbruecken;

das wird jetzt etwas laenger - vorueberlegungen:

a) kann man fuer den einsatz seiner selbstgeschriebenen
      konstruktor-funktionen immer sicherstellen, das diesem
      der name der zu initilisierenden objekt-variable ueber-
      geben wird? - nicht zweifelsfrei;

dieser, die ganze zeit als "dreckig" diskutierte ansatz,
      faellt also aus, obwohl es schon sehr nahe liegt, namen
      von globalen variablen ueber deren uebergeordnetes objekt
      "window" zu benutzen - bsp.:

die globale definition einer variablen "testObject" kann
      in einem js-client hoechst unterschiedlich ausfallen -

var testObject = new Object(); testObject.status = "test";
      //oder aber
      window.testObject = {status:"test"}; // aber auch
      window["testObject"] = {status:"test"};

in der letzten zeile steckt dann der schluessel fuer die
      referenzierung auf ein objekt, dessen variablen-namen
      bekannt ist (z.b. einer konstruktor-funktion, die diesen
      string-wert einem objekt mit auf dem weg gibt);
      zur referenzierung dient dann ein string, der auch in die
      oberflaeche des html-clients geschrieben werden kann:

"alert(window['" + variablenName + "'].status);"

b) wie kann man den ansatz aus a) - zuhilfenahme einer
      "string-referenz" - retten, obwohl a) verworfen
      werden muss?

es gibt zwei globale objekte im js-faehigen html-client:
      "window" als oberste "instanz" fuer alle "HTMLElement"-
      objekte und "Object" als oberste "instanz" fuer alle
      js-objekte;
      wenn kein string-wert (KEY) fuer den namen einer objekt-
      variablen verwendet werden darf, wie sieht es dann mit
      einer anderen form der "speicherung" aus - z.b.: INDEX?

das ist es - loesung:

(zum besseren verstaendnis werden nur die fundamentalen
       bestandteile vorgestellt, das ergebnis ist dann zwar
       funktionstuechtig aber in seiner gesamtheit angreifbar)

c) man erweitert das oberste js-objekt "Object" um ein array,
      dessen eintraege referenzen auf js-objekte jeglicher art
      sein sollen:

Object.selfReferences = [];

desweiteren benoetigt jedes js-objekt eine setter- bzw.
      getter-methode fuer seine referenz - beide methoden
      werden als prototypen ueber "Object" implementiert;

bei benutzung des setters "setSelfReference" wird dem
      array "Object.selfReferences" die referenz des aufruf-
      enden objekts hinzugefuegt - gleichzeitig bekommt das
      aufrufende objekt die eigenschaft "selfIndex" zugewiesen,
      deren numerischer wert dem index der objektreferenz im
      genannten array entspricht:

Object.prototype.setSelfReference = function() {
        this.selfIndex = Object.selfReferences.length;
        Object.selfReferences[this.selfIndex] = this;
      };

vor der umsetzung des getters soll noch einmal an den
      zweiten teil von a) mit dem fiktiven ergebnis -
      "alert(window['" + variablenName + "'].status);" -
      erinnert werden - etwas in der art, bezogen auf
      "Object.selfReferences", soll dabei schon herauskommen;

der rueckgabewert soll ein string sein, der in seiner
      evaluierten form, den zugriff auf das die getter-methode
      aufrufende objekt zulaesst - also so:

"Object.selfReferences[0]"

Object.prototype.getSelfReference = function() {
        return ("Object.selfReferences[" + this.selfIndex + "]");
      };

der einsatz eines an "Object" gebundenen arrays und die
      verfuegbarkeit von setter- und getter-Object-prototypen
      ermoeglicht es jedem js-objekt(auch teil-objekten eines
      js-objektes) referenzen auf denkbar einfache weise und
      unabhangig von den namen moeglicher objektvariablen zu
      schreiben und zu lesen;

einem einsatz steht jetzt nichts mehr im wege - nur -

der bis hierher vorgestellte loesung fehlt es an einer
      methode, selbstreferenzen sauber zu loeschen, oder aber
      das array von "unsauber" auf null gesetzten referenzen
      zu befreien;

die runde komplettloesung implementiert deshalb folgende
      eigenschaften:

das array   : Object.selfReferences;
      die methode : Object.selfReferences.isFragmented;
      die methode : Object.selfReferences.defragment;
      die methode : [obj].setSelfReference;
      die methode : [obj].getSelfReference;
      die methode : [obj].removeSelfReference;

nachzuschauem unter:
      http://www.pseliger.de/jsExtendedApi/jsApi.Object.selfReferences.dev.js
      anzuwenden mit:
      http://www.pseliger.de/jsExtendedApi/jsApi.Object.selfReferences.js

doch nun zuruck zum konstruktor "JB_Table":

die methoden "VglFkt" und "sort" lassen sich auch als
   prototypen-methoden von "JB_Table" umsetzen, wenn einige
   lokale variablen des konstruktors wie z.b. "ssort" jedem
   "JB_Table"-objekt als eigenschaften mitgegeben werden (this);

function JB_Table(tabId,vorsort) {
     this.setSelfReference();
     this.tabId = tabId;
     //Dein code;
   }
   JB_Table.prototype.vglFkt = function(a,b) {
     //Dein code
   };
   JB_Table.prototype.sort = function(s) {
     //Dein code
   };

die globale funktion "Text2Link" kann jetzt auch als
   prototypen-methode fuer das objekt "JB_Table" umgesetzt
   werden:

JB_Table.prototype.text2Link = function() {
     //moeglicherweise:
     var action = "javascript:" + this.getSelfReference() + ".sort(";
     //for(var i=0;i<5;i++) Text2Link("Kopf0_"+i,"javascript:Tabelle1.sort("+i+")") ;
     //die zeile hier darueber muss dahingehend abgewandelt
     //werden, dass ueber "this.tabId" auf den "tr"-knoten
     //zugegriffen wird, welcher die zu aendernden "td"-
     //knoten enthaelt; die knoten werden einzeln durch
     //gezaehlt und angepasst - vielleicht so: action + i + ")"
     //Dein code;
   };

viel erfolg - gute nacht - peterS. - pseliger@gmx.net

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