T-Rex: Instanznamen herausfinden

Moin,

  
function cClass()  
{  
}  
  
var objInstance = new cClass();  
  
alert( FUNKTION(objInstance) );  

das alert soll "objInstance" ausgeben. Wie heißt die Funktion dafür? gibt es die überhaupt?

Gruß
Instance of
T-Rex

  1. Die Anführungszeichenfunktion?

    alert("objInstance"); ;-)

    Ich glaub nicht dass es die gibt, hätte mal noch nie was davon gehört. Wofür brauchst du die denn?

  2. Hi,

    function cClass()
    {
    }

    var objInstance = new cClass();

    alert( FUNKTION(objInstance) );

    
    >   
    > das alert soll "objInstance" ausgeben. Wie heißt die Funktion dafür? gibt es die überhaupt?  
      
    Wozu brauchst Du das? An der Stelle, an der Du alert( FUNKTION(objInstance) ); hinschreibst, kannst Du genausogut alert( "objInstance" ); hinschreiben.  
      
    Und wenn Du das irgendwo im Objekt selbst machen willst:  
      
    `var secondReference = objInstance;`{:.language-javascript}  
      
    Schon gibt es 2 Referenzen auf Dein Objekt. Was sollte Deine Funktion in diesem Falle zurückliefern?  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. var secondReference = objInstance;

      Schon gibt es 2 Referenzen auf Dein Objekt. Was sollte Deine Funktion in diesem Falle zurückliefern?

      In diesem Fall soll "secondReference" ausgegeben werden.

      Und NATÜRLICH kann man auch alert("secondReference") aufrufen. Das wäre jedoch nicht automatisiert. Das gleiche ist wenn jemand fragt wie man 2 + 3 mittels Variablen rechnet. Antwort - ist doch immer 5, also schreib gleich 5 hin ;).

      Wenn es dafür jedoch wirklich keine Funktion gibt muss ich es dem Constructor irgendwie mitgeben. Das muss man halt immer bei initialisieren machen :(.

      Gruß
      automatisierter
      T-Rex

      1. Hi,

        kannst du mir erklären für was du sowas brauchst?
        Mir fällt nichts ein.

        ~dave

        1. Hi,

          kannst du mir erklären für was du sowas brauchst?
          Mir fällt nichts ein.

          ~dave

          Nagut da ihr jetzt ALLE gefragt habt erklär ich es dann doch mal.

          Da gibt es ein spezielles input Feld -> type='file'. Damit kann man Dateien an den Webserver senden. Sehr unschön ist, dass man eine Datei (falls es ein Bild ist) erst sieht, wenn man das komplette Formular (welches noch andere Textfelder oder ähnliches enthalten kann) abgeschickt hat. Da habe ich letztens einen netten Artikel gelesen wie man dieses komplette Abschicken (und somit "unsichtbare" hochladen eines Bildes) des Formulares mit Hilfe eines Iframes umgehen kann.

          Und zwar benötigt man dafür ein Formular, welches nur das type='file' in sich trägt und ein Iframe. Das Iframe hat z.B. den Namen "sklave". Das Formular bekommt ein target='sklave' und schickt somit die Daten an den Sklaven. Die Action des Formulares beinhaltet das Script welches die Daten, die es empfängt, verarbeiten kann. In diesem Fall wird also das Bild empfangen und auf dem Webserver gespeichert. In dem Iframe gibt es dann auch eine Ausgabe.

            
          <script>  
          parent.objInstance.createImage("src");  
          </script>  
          
          

          Man ruft ein Javascript auf, welches sich generell um den Dateiupload kümmert (zumindest das Layout) und übergibt ihm die Source des Bildes. Das Javascript erzeugt ein new Image() und setzt das eben hochgeladene Bild ins HTML. Somit sieht man das Bild bevor man das komplette Formular absendet.

          Und hier kommt meine Idee. Damit dieses Script das richtige Objekt im Javascript ansprechen kann gebe ich ihm den Namen in einem hidden Feld mit. Wäre es php könnte man so auf den Namen des Javascript Objektes zugreifen:
          $_POST['js_objekt'] = "objInstance" ($_FILE['upload'] wäre das Bild).
          Ergo stünde da

          echo "<script>  
          parent.".$_POST['js_objekt'].".createImage(".$strBildname.");  
          </script>";
          ~~~ (Der Code beinhaltet nur die Rudimentären Stücke)  
            
          Somit trenne ich Verarbeitung (php) und Layout (js) und ermögliche es, dass mehrere Objekte vom Typ "FileUpload" im JS existieren können.  
            
          Achja mir ist bekannt dass es auch ein Fileupload möglichkeit mittels Ajax gibt. Diese ist jedoch noch nicht für alle Browser zu nutzen :(, oder doch?  
            
          Hoffe ich konnte helfen :D.  
            
          Gruß  
          sich erklärender  
          T-Rex
          
          1. Hallo T-Rex,

            wieso so kompliziert? Du könntest die Objekte einfach in einer Liste sammeln:

            objectPool = {};  
            objectPool["objInstance"] = new cClass();
            

            Das Auslesen würde dann wie folgt geschehen:

            parent.objectPool[js_objekt].createImage("src");

            Noch einfacher wäre, einfach ein Array zur Speicherung der Objekte zu verwenden, wodurch du eine Art "Queue" hättest - spricht etwas dagegen, die einzelnen Objekte nicht beim Namen zu kennen?

            Gruss,
            Worf

            1. Hallo Worf,

              ich möchte nicht deinen Stolz brechen und mich schon gar nicht mit deinem Imperium anlegen, doch muss ich dir mitteilen, dass dies eine Alternative ist, aber nicht eine bevorzugte Lösung.
              Die Verwaltung sollte in der cClass() geschehen. Eine externe Verwaltung möchte ich nur im Notfall aufziehen.

              Gruß
              rIn
              T-Rex

              1. Hallo,

                eine Konstruktorfunktion oder Instanzmethode weiß nicht, was außerhalb von ihr passiert. Sie wissen nicht, unter welcher/welchen Variablen/Eigenschaften die Instanz, die der new-Aufruf zurückgibt, gespeichert wird, oder ob sie überhaupt irgendwo gespeichert wird – es sei denn, es wird ihr von außen mitgeteilt.

                Mathias

                1. Hallo,

                  eine Konstruktorfunktion oder Instanzmethode weiß nicht, was außerhalb von ihr passiert. Sie wissen nicht, unter welcher/welchen Variablen/Eigenschaften die Instanz, die der new-Aufruf zurückgibt, gespeichert wird, oder ob sie überhaupt irgendwo gespeichert wird – es sei denn, es wird ihr von außen mitgeteilt.

                  Mathias

                  Ich meine in PHP würde sowas funktionieren. Deshalb war meine Hoffnung groß, sowas (wenn auch mit Workarounds) auch in JS hin zu bekommen.
                  Aber dann muss ich es wohl irgendwie der Instanz mitteilen.

                  Danke!

                  Gruß
                  umständlicher
                  T-Rex

                  1. Hallo T-Rex,

                    Deine Worte mochten mich herausfordern, so soll es sein:

                    function cClass()  
                    {  
                    }  
                      
                    cIn = new cClass();  
                      
                    for (var k in this)  
                    {  
                    	if (this[k] instanceof cClass)  
                    	{  
                    		alert("Instanzvariable:" + k);  
                    	}  
                    }
                    

                    Es würde wohl funktionieren (wenn man den Scope berücksichtigt), aber schön ist es wohl eher nicht (eine Schleife, um die Variable zu finden?..).
                    Allerdings würde bei deinem Beispiel die $_POST-Variable von PHP der "objectPool"-Variablen in meinem Beispiel entsprechen.

                    Gruss,
                    Worf

                    1. Hallo Worf,

                      molily hatte eine gute Idee!
                      Nach dem Prinzip habe ich es gebaut.
                      Da auch du mir geholfen hast, möchte ich dir auch das fertige Script zuschicken. Da du keine E-Mail angegeben hast (ich jedoch schon), schreibe mich doch kurz an per Mail. Werde dir dann das Script zuschicken.

                      Gruß
                      dankender
                      T-Rex

          2. Hallo,

            Allgemein: Vermeide globale Variablen, soweit es geht. Vermeide es, Objekte irgendwo öffentlich zu speichern, um auf sie zuzugreifen. Versuche, Funktionalität zu kapseln.

            In deinem Fall kommst du m.W. nicht ganz umhin, mit globalen Variablen zu arbeiten. Es ergibt mehr Sinn, eine globale Variable mit festem Namen im iframe zu setzen. Denn im Kontext des Iframes kann es nur eine solche Variable geben, während es im Kontext des Parents viele Objektinstanzen geben kann. Der Iframe weiß ohne weiteres nicht, zu welcher Instanz er gehört. Die Instanz weiß aber, dass ihr das Iframe gehört, verfügt also dediziert darüber. Richtig?

            Ich würde im iframe eine Variable setzen und die im Parent auslesen:

            Der Iframe:

            <iframe id="uploadframe"></iframe>

            Beim Starten des Uploads (Absenden des Formulars, submit):

            var iframe = document.getElementById('uploadframe');
            iframe.onload = function () {
              alert(iframe.contentWindow.imageSrc);
            };

            Das Dokument im iframe:

            <script>
            imageSrc = '<?php echo ... ?>';
            </script>

            Mathias

            1. Das ist eine Super Idee!!

              Eigentlich würde ich sagen, es ist eine unschöne Lösung, da das Iframe ja wissen muss wie die Variablen heißen müssen. ABER das Iframe müsste bei einem Methodenaufruf ja auch wissen wie die Methode heißt :D.

              von daher Super Idee.
              Viel besser als das Klingonische Etwas :D hrhr.

              trotzdem vielen Dank an euch beide!
              Falls ihr wollt würde ich euch per Mail das komplette Script zukommen lassen.

              Gruß
              aus dem Iframe
              T-Rex

      2. gruss T-Rex,

        var secondReference = objInstance;

        Schon gibt es 2 Referenzen auf Dein Objekt. Was sollte Deine Funktion in diesem Falle zurückliefern?

        In diesem Fall soll "secondReference" ausgegeben werden.

        <p class="polemisch">Nein, soll es nicht.</p>

        Ich denke, wie Mudgard auch, dass Deinem Wunsch ein konzeptioneller Fehler zugrundeliegt.
        Warum möchtest Du den Variablennamen (hier im globalen Namensraum) wissen?

        so long - peterS. - pseliger@gmx.net

        --
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
        ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
      3. Hi,

        var secondReference = objInstance;

        Schon gibt es 2 Referenzen auf Dein Objekt. Was sollte Deine Funktion in diesem Falle zurückliefern?

        In diesem Fall soll "secondReference" ausgegeben werden.

        Warum?
        Was zeichnet secondReference gegenüber objInstance aus? Daß sie "neuer" ist? Hm.
        Welche der (zumindest theoretisch unendlich vielen) Referenzen soll hier ausgegeben werden? Und wie sieht es aus, wenn diese gar keinen Namen hat?

        var bla = [ objInstance, 0, 17, 42 ]

        Wenn es dafür jedoch wirklich keine Funktion gibt muss ich es dem Constructor irgendwie mitgeben.

        Hm, das widerspricht irgendwie der Aussage, daß Du "secondReference" haben willst. Denn beim Konstruieren war ja noch "objInstance" aktuell.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hm, das widerspricht irgendwie der Aussage, daß Du "secondReference" haben willst. Denn beim Konstruieren war ja noch "objInstance" aktuell.

          Das stimmt. Ich wollte damit nur sagen, dass ich es irgendwie ins Objekt bringen muss. Das ich eine Instanz kopiere wäre theoretisch möglich, in meinem Fall aber nicht relevant.

          Ich glaube mein Problem habe ich falsch ausgedrückt. Ich möchte nicht den Namen der Instanz haben, sondern den Namen der Variablen, welche die Instanz beinhaltet.

          Gruß
          no copy of
          T-Rex

          1. Hi,

            Hm, das widerspricht irgendwie der Aussage, daß Du "secondReference" haben willst. Denn beim Konstruieren war ja noch "objInstance" aktuell.
            Das stimmt. Ich wollte damit nur sagen, dass ich es irgendwie ins Objekt bringen muss. Das ich eine Instanz kopiere wäre theoretisch möglich,

            Es wird ja gar nicht kopiert. Es wird eine (zusätzliche) Referenz auf das Objekt angelegt.

            Ich glaube mein Problem habe ich falsch ausgedrückt. Ich möchte nicht den Namen der Instanz haben, sondern den Namen der Variablen, welche die Instanz beinhaltet.

            Die Variable hält weder Bein noch Händchen, sie enthält eine (von potentiell unendlich vielen) Referenzen auf das Objekt.

            Du hast immer noch nicht gesagt, warum das Object den Namen einer der Variablen kennen muß, die eine Referenz auf das Objekt enthalten.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Du hast immer noch nicht gesagt, warum das Object den Namen einer der Variablen kennen muß, die eine Referenz auf das Objekt enthalten.

              doch habe ich

              Gruß
              verlinkender
              T-Rex