Christian S.: private und public static Methoden/Properties

Hi,

kann mir jemand erklären, wie ich private und public static Methoden in JavaScript beschreibe??

Ich möchte eine Klasse haben, mit 2 statischen public Methoden (Show und Hide).

In diesen Methoden muss ich auf ein statisches DIV Element zugreifen, was nur einmal existiert und nur einmal erzeugt wird. dieses kann doch dann private sein?

verstehe nicht ganz den Unterschied zwischen this.constructor, MyClass und MyClass.constructor.

Hier mein Code: (der nicht so klappt wie er soll)

  
function HoverMenu()  
{  
    // private static  
    this.constructor.Div = document.createElement("div");  
    document.body.appendChild(this.constructor.Div);  
  
    this.constructor.getOffset = function(o)  
    {  
        HoverMenu.X = 0;  
        HoverMenu.Y = 0;  
        while(o)  
        {  
            HoverMenu.X += o.offsetLeft;  
            HoverMenu.Y += o.offsetTop;  
            o = o.offsetParent;  
        }  
    };  
}  
  
HoverMenu.Show = function(e, content)  
{  
    if(!e) var e = window.event;  
  
    if(!this.constructor.Div)  
    {  
        HoverMenu();  
    }  
  
    var div = this.constructor.Div;  
  
    div.style.backgroundColor = "#FFFF80";  
    div.style.border = "1px solid #000000";  
  
    var el = e.target || e.srcElement;  
  
    this.constructor.getOffset(el);  
  
    var timer;  
  
    el.onmouseout = function()  
    {  
        timer = window.setTimeout("HoverMenu.Hide();", 200);  
    };  
  
    if(div.firstChild)  
    {  
        div.removeChild(div.firstChild);  
    }  
  
    div.innerHTML = content;  
  
    div.onmouseout = function()  
    {  
        timer = window.setTimeout("HoverMenu.Hide();", 200);  
    };  
  
    div.onmouseover = function()  
    {  
        clearTimeout(timer);  
    };  
  
  
  
    div.style.position = "absolute";  
    div.style.visibility = "visible";  
  
    div.style.left = HoverMenu.X - div.offsetWidth - 5 + "px";  
    div.style.top = HoverMenu.Y + "px";  
};  
  
HoverMenu.Hide = function()  
{  
    var div = this.constructor.Div;  
    div.style.visibility = "hidden";  
};  
  

Was ich möchte ist folgendes: Ich möchte mit HoverMenu.Show(event, "Inhalt") ein kleines Popup links neben dem aufrufenden Element öffnen. Dafür soll immer dasselbe DIV genommen werden, nur mit anderem Inhalt.

Beim ersten Show soll daher geprüft werden, ob das DIV schon angelegt wurde. Wenn nicht soll sie den Konstruktor, nämlich HoverMenu() aufrufen, in der das DIV angelegt wird und auch die statische private Methode getOffset.

Leider klappt das alles nicht so. in der nächsten Zeile (var div = this.constructor.Div;) ist div == null.

Jemand Tipps? also auch zum generellen Umgang mit private und public Methods...

Kann ich die Show Methoden zB nicht auch innerhalb der HoverMenu() function einbetten mit this.constructor.Show = function(){...} ??

Gruß
Christian

  1. hi,

    kann mir jemand erklären, wie ich private und public static Methoden in JavaScript beschreibe?? [...]
    verstehe nicht ganz den Unterschied zwischen this.constructor, MyClass und MyClass.constructor.

    Mein Standardlink zum Thema: http://phrogz.net/JS/Classes/OOPinJS.html

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. kann mir jemand erklären, wie ich private und public static Methoden in JavaScript beschreibe??

    Ich bin nicht so bewandert mit den OOP Begriffen, statische Methoden sind...?
    BZw. dienen zu?

    Ich möchte eine Klasse haben, mit 2 statischen public Methoden (Show und Hide).

    verstehe nicht ganz den Unterschied zwischen this.constructor, MyClass und MyClass.constructor.

    this.constructor ist die Funktion, mit dem du das aktuelle Objekt erzeugst oder erzeugt hast. Wennn MyClass der Name der funktion ist, ist this.construcor und myClass das Gleiche und myClass.contructor gibt es nicht.

    [code lang=JavaScript]
    function HoverMenu()
    {
        // private static
        this.constructor.Div = document.createElement("div");

    Das ist nicht private, private static dürfte auch etwas kompliziert sein, wenn ich das richtig gelesen habe, versucht er http://www.litotes.demon.co.uk/js_info/private_static.html das.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hi,

      this.constructor ist die Funktion, mit dem du das aktuelle Objekt erzeugst oder erzeugt hast. Wennn MyClass der Name der funktion ist, ist this.construcor und myClass das Gleiche und myClass.contructor gibt es nicht.

      Dachte ich auch so, aber irgendwie geht folgendes nicht:

        
        
      function HoverMenu()  
      {  
          this.constructor.Div = document.createElement("div");  
      }  
        
      HoverMenu.Show = function(e, content)  
      {  
          if(!this.constructor.Div)  
          {  
              this();  
          }  
        
          var div = this.constructor.Div;  
          alert(div);  
      };  
      
      

      ersetze ich das durch das folgende, dann gehts.

        
        
      function HoverMenu()  
      {  
          HoverMenu.Div = document.createElement("div");  
      }  
        
      HoverMenu.Show = function(e, content)  
      {  
          if(!HoverMenu.Div)  
          {  
              this();  
          }  
        
          var div = HoverMenu.Div;  
          alert(div);  
      };  
      
      

      Ich vermute mal this ist in statischen Methoden einfach nicht verfügbar... aber innerhalb function HoverMenu() müsste doch this.constructor und HoverMenu dasselbe sein!???

      Gruß
      Christian

      1. hi,

        Dachte ich auch so, aber irgendwie geht folgendes nicht:

        function HoverMenu()
        {
            this.constructor.Div = document.createElement("div");
        }

        Warum willst du dieses Objekt "am Konstruktur" ablegen?

        Warum deklarierst du nicht eine private Eigenschaft mittels Keyword var - das war doch das, was du anfangs auch beschrieben hattest?

        ersetze ich das durch das folgende, dann gehts.
        function HoverMenu()
        {
            HoverMenu.Div = document.createElement("div");

        Damit legst du es aber als Eigenschaft deiner Klasse an - bei Erzeugung einer weiteren Instanz übershcreibst du dir damit m.W. das Objekt in vorherigen Instanzen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. gruss Christian S.

        lies dich ebenfalls mal hier kurz von oben nach unten durch:
           http://forum.de.selfhtml.org/archiv/2007/3/t147874/#m959111

        this.constructor ist die Funktion, mit dem du das aktuelle Objekt
        erzeugst oder erzeugt hast. Wennn MyClass der Name der funktion
        ist, ist this.construcor und myClass das Gleiche und myClass.contructor
        gibt es nicht.

        Dachte ich auch so, aber irgendwie geht folgendes nicht:
        ...
        ersetze ich das durch das folgende, dann gehts.
        ...

        [this.constructor] enthaelt nicht immer die referenz auf die eigentliche
           konstruktorfunktion, sondern muss unter umstaenden ausdruecklich ueber
           [arguments.callee] zugewiesen werden:
           http://forum.de.selfhtml.org/archiv/2007/3/t147874/#m959216

        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:]
        1. Hi,

          [this.constructor] enthaelt nicht immer die referenz auf die eigentliche
             konstruktorfunktion, sondern muss unter umstaenden ausdruecklich ueber
             [arguments.callee] zugewiesen werden:

          Danke, das hat schon mal geholfen... ganz verstehen tu ich das dennoch nicht...

          Mich wundert es auch gerade, dass ich innerhalb der statischen Methode auf this zugreifen kann. In Java und C# wäre das nicht möglich. Widerspricht ja auch irgendwie dem Gefühl für statische Methoden, da diese ja an kein Objekt gebunden sind, this aber immer auf die eigene _Instanz_ verweist (die es bei statischen Methoden aber nicht gibt).

          HoverMenu.Show = function(e, content)
          {
              if(!e) var e = window.event;

          if(!this.Div)
              {
                  this(); // wie HoverMenu()
              }
          //.....

          };

          Gruß
          Christian

          1. HoverMenu.Show = function(e, content)
            {
                if(!e) var e = window.event;

            if(!this.Div)
                {
                    this(); // wie HoverMenu()

            Das ist Unsinn this ist keine Funktionsreferenz, die du aufrufen kannst.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. HoverMenu.Show = function(e, content)
              {
                  if(!e) var e = window.event;

              if(!this.Div)
                  {
                      this(); // wie HoverMenu()

              Das ist Unsinn this ist keine Funktionsreferenz, die du aufrufen kannst.

              Struppi.

              offenbar schon... mich wundert es auch. aber es geht. im FF und im IE getestet.

              this.constructor() geht hingegen nicht.

              Gruß
              Christian

              1. offenbar schon... mich wundert es auch. aber es geht. im FF und im IE getestet.

                OK, Denkfehler.

                this ist immer der Kontext in dem du dich gerade befindest, es ist also in dem Falle die Referenz auf die Funktion HoverMenu(), nichts weiter, es hat nichts mit den Objekten zu tun, die du aus HoverMenu erzeugst.
                Das ist ein eine Eigenart von JS, this ist immer irgendwas.

                Struppi.

                --
                Javascript ist toll (Perl auch!)
      3. Ich vermute mal this ist in statischen Methoden einfach nicht verfügbar... aber innerhalb function HoverMenu() müsste doch this.constructor und HoverMenu dasselbe sein!???

        ich weiß auch nicht was du mit dem constructor erreichen willst. constructor ist erst mal nur die Funktion mit der du ein Objekt erzeugst sonst nichts.

        Wie ist das denn bei anderen Programiersprachen mit statischen Methoden?

        Wie schon erwähnt ein statische privates Objekt ist nicht einfach, z.b. so:

        function HoverMenu()  
        {  
            // private static  
         this.addDiv2Body();  
        }  
        HoverMenu.prototype = (  
        function()  
        {  
            var div = document.createElement("div");  
         div.innerHTML = 'Test';  
         var add = false;  
         return {  
         getDiv: function() { return div;},  
         addDiv2Body: function() { if(!add) document.body.appendChild( div ); add = true;}  
         };  
          
        }  
        )();
        

        Struppi.

        --
        Javascript ist toll (Perl auch!)