Ergebnis 1 bis 11 von 11
  1. #1
    GELight ist offline Tripel-As
    registriert
    13-02-2005
    Beiträge
    202

    Javascript und Referenzen

    Hallo alle zusammen,

    Wie ich mitbekommen habe, übergibt Javascript Variablen grundsätzlich als Referenz ... richtig?
    Ich vermute dadurch bekomme ich an einer bestimmten Stelle meiner Struktur ein Problem.
    Ich beschreibs mal:

    Der Code zeigt die Anwendung meines kleinen Frameworks. ( ist ja noch nicht sonderlich viel da )
    ... jsC.components ist eine Instanz eines Objects, welches ich für die Verwaltung der späteren Componenten verwenden möchte bzw. verwende. Dieses Object hat auch eine Methode add(); über die gleich zu Beginn die ComponentenClassen registrieren lasse. Und hier werden die Klassen der Componenten auch zB. um eine add(); Methode erweitert, die ich später wie unten zu sehen nutze. Das Registrieren sieht zB so aus:
    PHP-Code:
    var Panel = function() {
    }

    Panel.prototype = {
        
        
    show: function() {
        }
        
    }
    jsCow.prototype.components.add('Panel'Panel); 
    ... jsC.components.get('Panel'); gibt eine neue Instanz meiner Panel-Klasse zurück.

    PHP-Code:
    panel1 jsC.components.get('Panel');
    panel2 jsC.components.get('Panel');

    panel2.setID('p2');
    panel1.setID('p1').add(panel2).show(); 
    add(); ist eine Methode, die vom Framework nachträglich in die Classenstruktur der Componenten gepackt wird. Diese hat später also jede Componente.
    Innerhalb der add(); Methode wird jedem ChildObject this als Parent gesetzt und das neue child wird mit push() in this.children geschrieben. Der Code schaut so aus:
    ( this ist in diesem Fall natürlich panel1 )
    PHP-Code:
        add: function(child) {
            
            
    child.setParent(this);

            
    console.debug('this: 'this.idthis);
            
    console.debug('child: 'child.idchild);
            
            
    this.children.pushchild );
            
            return 
    this;
        } 
    Problem ist nun, dass sobald ich die ComponentenMethode add() auch nur einmal wie in diesem Beispiel zu sehen ausführe, er zwar panel1 korrekt als child von panel2 setzt aber ab diesem Zeitpunkt hat panel2 sich selbst als children und ich habe keine Idee warum er das tut.

    Gruß Mario
    Geändert von GELight (07-04-2011 um 09:56 Uhr)

  2. #2
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.695

    AW: Javascript und Referenzen

    Wo wird denn das Attribut children definiert?

  3. #3
    GELight ist offline Tripel-As
    registriert
    13-02-2005
    Beiträge
    202

    AW: Javascript und Referenzen

    Hi kkapsner,

    this.children wird zusammen mit der gezeigten add(child) Methode angelegt. Also die Componente wird erweitert, sobald man sie mit jsCow.prototype.components.add('Panel', Panel); in der Basisklasse registriert.

    @EDIT: Hier wäre mal das gesamte Components Object, wo man sehen kann, wie und an welcher Stelle ich die zu registrierende Componente erweitere und hinzufüge.

    PHP-Code:
    /**
     * @description Class structure of 'component'
     */
    var component = function() {

        
    /**
         * @description ObjectList of registered components
         */
        
    this.types = {};
        
    };

    component.prototype = {
        
        
    /**
         * @description Register new component and expand the component to required jsCow methods
         * @return component object
         */
        
    add: function(idc) {
            
            
    /**
             * Expand the component
             */
            
    $.extend(c.prototype, {
            
                
    idfalse,
                
    parent: {},
                
    dom: {},
                
    config: [],
                
    children: [],
            
                
    setID: function(id) {
                    
    this.id id;
                    
                    return 
    this;
                },
                
                
    setConfig: function(config) {
                    $.
    extend(truethis.configconfig);
                    
                    return 
    this;
                },
                
                
    setParent: function(parent) {
                    
    this.parent parent;
                    
                    return 
    this;
                },
                
                
    add: function(child) {
                    
                    
    child.setParent(this);
                    
    child.setConfig({
                        
    targetthis.dom.content
                    
    });

                    
    console.debug('this: 'this.idthis);
                    
    console.debug('child: 'child.idchild);
                    
                    
    this.children.pushchild.id );
                    
                    return 
    this;
                }
            
            });
            
            
    this.types[id] = c;
            
            return 
    this;
        },
        
        
    /**
         * @description Get instance of registered component
         * @return component object
         */
        
    get: function(c) {
            if (
    this.types[c]) {
                return new 
    this.types[c];
            }else{
                return {};
            }
        }
        
    }

    jsCow.prototype.components = new component(); 
    Ich könnte mir vorstellen, dass ich evtl. einen Denkfehler an der Stelle habe, WIE ich die ComponentenClassen hinzufüge oder?

    Also diese Stelle:
    PHP-Code:
    var Panel = function() {
    }

    Panel.prototype = {
        
        
    show: function() {
        }
        
    }
    jsCow.prototype.components.add('Panel'Panel); 
    Gruß Mario
    Geändert von GELight (07-04-2011 um 14:42 Uhr)

  4. #4
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Javascript und Referenzen

    Zitat Zitat von GELight Beitrag anzeigen
    Problem ist nun, dass sobald ich die ComponentenMethode add() auch nur einmal wie in diesem Beispiel zu sehen ausführe, er zwar panel1 korrekt als child von panel2 setzt aber ab diesem Zeitpunkt hat panel2 sich selbst als children und ich habe keine Idee warum er das tut.
    Wir auch nicht. Du hast es zwar schön beschrieben, aber jetzt Wissen wir nur, was passiert ohne zu sehen warum das passieren sollte.

    Weiter oben ist auch eine Merkwürdigkeit.
    Code:
    jsCow.prototype.components.add('Panel', Panel);
    Warum rufst du hier über prototype die Funktion auf? Kann es sein, dass jsCow besser ein singleton Konstrukt sein sollte?

  5. #5
    GELight ist offline Tripel-As
    registriert
    13-02-2005
    Beiträge
    202

    AW: Javascript und Referenzen

    Okay... also das WARUM:

    Ich möchte die Componenten aus 2 Gründen innerhalb des Frameworks registrieren, bevor ich mir daraus Instanzen hole.
    1. Damit der Entwickler einer Componente sich auf die wesentlichen Funktionen / Methoden der Componente konzentrieren kann und nicht auch Methoden, die das System braucht immer wieder mit schreiben muss... und...
    2. Damit ich gegenüber dem Punkt 1 per Framework die Componenten automatisch mit den benötigten Systemfunktionen ausstatten kann. ... In dem Fall, wird hier das this.children Array oder die add() Methode oder was auch immer eh in allen Komp. gleich wäre etc... der Komponente hinzugefügt.

    Die Merkwürdigkeit:
    PHP-Code:
    jsCow.prototype.components.add('Panel'Panel); 
    Weil ich noch nicht so recht wusste, wie ich das Basiszeug anders aufbauen bzw. am saubersten erweitern könnte. Was meinst du genau mit Singelton? Etwa direkt ausführen lassen um mit einer Instanz direkt arbeiten zu können?

    Gruß Mario
    Geändert von GELight (07-04-2011 um 15:56 Uhr)

  6. #6
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Javascript und Referenzen

    Es ist schwierig ohne lauffähigen Code, zu sagen was da falsch sein könnte. Aber ich vermute, dass das Framework ene Rolle spielen könnte. Woher kommt denn $.extend?

  7. #7
    GELight ist offline Tripel-As
    registriert
    13-02-2005
    Beiträge
    202

    AW: Javascript und Referenzen

    Ich hab schon fast den gesamten Code gepostet hehe
    Wie im Codeblock unten zu sehen, ist das extend in der add Methode von components.
    Sobald ich die Komponente adde, soll er diese erweitern...

    Gruß Mario

  8. #8
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.695

    AW: Javascript und Referenzen

    children wird dem prototype des neu erstellten Konstruktors als Eigenschaft gegeben und dem wird ein Array zugewiesen. Das ist aber dann natürlich für alle Instanzen auch der gleiche Array. Kleines vereinfachtes Beispiel:
    Code:
    function test(){
    	this.instances.push(this);
    }
    test.prototype.instances = [];
    test.prototype.toString = function(){
    	return this.instances.indexOf(this);
    };
    
    var a = new test();
    var b = new test();
    var c = new test();
    var d = new test();
    
    alert(a.instances);
    alert(d.instances);
    Wenn du pro Instanz einen eigenständigen Array haben willst, musst diesen entweder im Konstruktor anlegen (willst du nicht, da sich da der Entwickler wieder drum kümmen müsste) oder beim Zugriff jedes mal testen, ob diese Eigenschaft schon existiert und gegebenenfalls den Array erzeugen (dem prototype darf die Eigenschaft dann natürlich nicht als Array gegeben werden):
    Code:
    function test(name){
    	this.name = name;
    }
    test.prototype.children = false;
    test.prototype.add = function(i){
    	if (!this.children) this.children = [];
    	this.children.push(i);
    }
    test.prototype.toString = function(){
    	return this.name + (this.children? "[" + this.children.join(", ") + "]": "");
    };
    
    var a = new test("a");
    var b = new test("b");
    var c = new test("c");
    var d = new test("d");
    
    b.add(d);
    d.add(c);
    d.add(a);
    alert(a);
    alert(b);

  9. #9
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Javascript und Referenzen

    Zitat Zitat von GELight Beitrag anzeigen
    Wie im Codeblock unten zu sehen, ist das extend in der add Methode von components.
    Aber es ist nicht zu sehen, dass extend den prototype erweitert, dass muss man aber Wissen um auf den Schluss zu kommen, den kkapsner gefunden (erraten?) hat.

  10. #10
    GELight ist offline Tripel-As
    registriert
    13-02-2005
    Beiträge
    202

    AW: Javascript und Referenzen

    Hi ein_schlauer,

    Ehrlich gesagt wusste ich nicht, wie genau ich es noch beschreiben und zeigen sollte.
    Im Code war doch eigentlich genau gezeigt, an welcher Stelle ich das Object der Componente erweitern wollte/will. Das war doch genau die Stelle mit dem extend... wenn auch die Umsetzung noch fehlerhaft war. ( okay sonst hätte ich nicht gefragt )

    @kkapsner
    Vielen Dank für deine kleinen Beispiele. Nachdem ich sie erst Stundenlang nicht wirklich verstanen habe, habe ich eben einfach mal den Test gemacht und meine Struktur dementsprechend angepasst. Und siehe da... es scheint zu funktionieren. Ich kanns ja nochmal zeigen... habe dazu aber noch eine kleine Frage:

    Also ich habe die Erweiterung der ComponentenKlasse nun in die get Methode vom components Object gepackt und sie schaut nun so aus:
    PHP-Code:
        get: function(c) {
            if (
    this.types[c]) {
                
                var 
    cmp this.types[c];
                
                
    /**
                 * Expand the component
                 */
                
    cmp.prototype.children false;
                
    cmp.prototype = {
                    
                    
    idfalse,
                    
    parent: {},
                    
    config: [],
                    
    dom: {},
                    
                    
    add: function(child) {
                        
                        if(!
    this.childrenthis.children = [];
                        
                        
    child.setParent(this);
                        
    child.setConfig({
                            
    targetthis.dom.content
                        
    });
                        
                        
    this.children.push(child);
                        
                        return 
    this;
                    },
                    
                    
    setID: function(id) {
                        
    this.id id;
                        
                        return 
    this;
                    },
                    
                    
    setConfig: function(config) {
                        $.
    extend(truethis.configconfig);
                        
                        return 
    this;
                    },
                    
                    
    setParent: function(parent) {
                        
    this.parent parent;
                        
                        return 
    this;
                    }
                    
                }
                
                return new 
    cmp;
            }else{
                return {};
            }
        } 
    Wenn ich das mit dem children Array so gemacht habe, dass es erst auf false gesetzt wird und erst in der add methode gesetzt wird... müsste ich das dann nicht auch für die anderen Eigenschaften machen?
    id: false,
    parent: {},
    config: [],
    dom: {},

    Es funktioniert zwar jetzt mit dem children Array aber wenn dann will ich es auch ganz verstehen mit den anderen Variablen etc...

    Gruß Mario

  11. #11
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.695

    AW: Javascript und Referenzen

    parent, config und dom musst du genauso behandeln. id nicht, da es direkt überschrieben wird.

Ähnliche Themen

  1. Memory Leaks: Verwaiste Referenzen finden
    Von hejira im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 27-03-2009, 11:17
  2. Antworten: 1
    Letzter Beitrag: 28-03-2008, 17:33
  3. Antworten: 3
    Letzter Beitrag: 27-07-2006, 16:59
  4. nochma was zu referenzen...
    Von flexi im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 18-08-2002, 16:23
  5. *argh* find keine referenzen...
    Von flexi im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 18-08-2002, 15:15

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •