Jürgen P.: JavaScript Object Notation

Hallo,

ich notiere Objekte in js files normalerweise so.

TABLE ={
 variable1:null,
 variable2:null,

method: function(){
   /* Do something*/
 },
 helperMethod: function(){
   /* Do something*/
 }
}

Nun brauche ich Variable 2 eigentlich nicht nach aussen sichtbar zu machen und die HelperMethode auch nicht, gibt es Möglichkeiten, diese nicht nach aussen zu geben?

Gruß,

JP

  1. Hallo,

    ich notiere Objekte in js files normalerweise so.

    TABLE ={
    variable1:null,
    variable2:null,

    method: function(){
       /* Do something*/
    },
    helperMethod: function(){
       /* Do something*/
    }
    }

    Nun brauche ich Variable 2 eigentlich nicht nach aussen sichtbar zu machen und die HelperMethode auch nicht, gibt es Möglichkeiten, diese nicht nach aussen zu geben?

    Ja, mehrere. Für mich ist dieses Konstrukt ein singleton, folglich benutze ich dann gerne diese Schreibweise:

    TABLE = new function() {  
      
    };  
    
    

    Ansonsten kannst du auch eine anonyme Funktion aufrufen und das Objekt als Rückgabewert erzeugen:

    TABLE = ( function() {  
    return {  
    /* dein Objekt */  
    };  
    })();  
    
    

    Struppi.

    1. Hallo,

      Ja, mehrere. Für mich ist dieses Konstrukt ein singleton, folglich benutze ich dann gerne diese Schreibweise:

      TABLE = new function() {

      };

      
      >   
      > Ansonsten kannst du auch eine anonyme Funktion aufrufen und das Objekt als Rückgabewert erzeugen:  
      >   
      > ~~~javascript
      
      TABLE = ( function() {  
      
      > return {  
      > /* dein Objekt */  
      > };  
      > })();  
      > 
      
      

      Singleton heißt doch aber nur, dass du mit einer (immer der gleichen und nicht mehreren) Instanz der Klasse hantierst. Welche Variablen oder Methoden privat sind, definierst Du damit doch nicht, oder?

      Gruß

      jobo

      1. Singleton heißt doch aber nur, dass du mit einer (immer der gleichen und nicht mehreren) Instanz der Klasse hantierst. Welche Variablen oder Methoden privat sind, definierst Du damit doch nicht, oder?

        Nein, aber das Orginal ist ja kein echtes Objekt das mit new erzeugt wurde, daher auch keine private Gültigkeit kennt, daher bevorzuge ich die Schreibweise, die eine echte Instanz eines Objektes erzeugt und dort existiert dann ein privater Bereich.

        Struppi.

        1. Hallo,

          Nein, aber das Orginal ist ja kein echtes Objekt das mit new erzeugt wurde, daher auch keine private Gültigkeit kennt, daher bevorzuge ich die Schreibweise, die eine echte Instanz eines Objektes erzeugt und dort existiert dann ein privater Bereich.

          mit var myPrivateMethod = function() {

          }

          ??

          Gruß

          jobo

          1. mit var myPrivateMethod = function() {

            }

            ??

            Ich weiß nicht was du mich damit fragen möchtest.

            Struppi.

            1. Hallo,

              mit var myPrivateMethod = function() {

              }

              ??

              Ich weiß nicht was du mich damit fragen möchtest.

              wodurch die Methode dann privat wird. Bei deinem Bespiel kann ich sie doch mit myInstance.notPrivateMethod() jederzeit aufrufen, oder? Was muss ich tun, damit das nicht geht, die Methode also privat ist. Die Antwort von "module pattern" geht ja in die Richtung, durch Deklaration einer privaten Variablen mittels "var".

              Gruß

              jobo

              1. mit var myPrivateMethod = function() {

                }

                ??

                Ich weiß nicht was du mich damit fragen möchtest.

                wodurch die Methode dann privat wird. Bei deinem Bespiel kann ich sie doch mit myInstance.notPrivateMethod() jederzeit aufrufen, oder?

                Was heißt oder?
                Nein - du kannst die private Methode nicht aufrufen.

                Struppi.

                1. Hallo,

                  Was heißt oder?
                  Nein - du kannst die private Methode nicht aufrufen.

                  Dann hab ichs nicht kapiert. Ich dachte, die private Methode ist in Wirklichkeit keine Methode des Objektes selbst. In PHP kann ich innheralb der Klasse $this->myPrivateMethod() aufrufen, außerhalb dann aber mit $myInstance->myPrivateMethod() aber gibts eins auf die Finger. Hier aber bei Javascript existiert this.myPrivateMethod() garnicht, oder?

                  Gruß

                  jobo

                  1. Was heißt oder?
                    Nein - du kannst die private Methode nicht aufrufen.

                    Dann hab ichs nicht kapiert. Ich dachte, die private Methode ist in Wirklichkeit keine Methode des Objektes selbst. In PHP kann ich innheralb der Klasse $this->myPrivateMethod() aufrufen, außerhalb dann aber mit $myInstance->myPrivateMethod() aber gibts eins auf die Finger. Hier aber bei Javascript existiert this.myPrivateMethod() garnicht, oder?

                    So sieht's aus. Es sind auch keine echten privaten Methoden oder Attributen des Objektes, sondern nur nach aussen nicht sichtbare.

                    Struppi.

        2. Nein, aber das Orginal ist ja kein echtes Objekt das mit new erzeugt wurde, daher auch keine private Gültigkeit kennt, daher bevorzuge ich die Schreibweise, die eine echte Instanz eines Objektes erzeugt und dort existiert dann ein privater Bereich.

          private member kann ich bei new function(){..} und (function(){..})() haben, schließlich gibts in beiden fällen einen funktions-scope und ich kann darin closures notieren. wie etwa beim bekannten revealing module pattern

          var o = new function () {
            var private = "yo";
            function public () { alert(private); }
            this.public = public;
          };

          vs.

          var o = (function () {
            var private = "yo";
            return {
              public : public
            };
            function public () { alert(private); }
          })();

          doug crockford hat im YUI blog mal gegen new function argumentiert

          1. Nein, aber das Orginal ist ja kein echtes Objekt das mit new erzeugt wurde, daher auch keine private Gültigkeit kennt, daher bevorzuge ich die Schreibweise, die eine echte Instanz eines Objektes erzeugt und dort existiert dann ein privater Bereich.

            private member kann ich bei new function(){..} und (function(){..})() haben,

            hab ich auch nicht bestritten.

            doug crockford hat im YUI blog mal gegen new function argumentiert

            Naja. überzeugt mich nicht.

            Struppi.

            1. Hallo,

              Naja. überzeugt mich nicht.

              Da gibts bei den Kommentaren ja einige. Wobei ich die Stringenz hinter Crougfords Argumentation nicht so beiseite wischen wollen würde. Das scheint mir bei ihm schon alles sehr gut durchdacht und mit einer Menge (!) Hintergrundwissen.

              Gruß

              jobo

          2. Hallo,

            doug crockford hat im YUI blog mal gegen new function argumentiert

            und wer will schon gegen douglas crockford argumentieren (;-).

            wie private vars einbezogen werden, scheint mir plausibel. aber private methoden? oder hab ich da was übersehen. oder oder ist die private methode im grunde eben kein (echter) bestandteil der "klasse", sondern wird lediglich im gleichen scope definiert wie die klasse bzw. das objekt, so dass selbiges bei seiner entstehung auf die private funktion bzw. das, was darin erzeugt wird, zugreifen kann?

            Gruß

            jobo

            1. wie private vars einbezogen werden, scheint mir plausibel. aber private methoden?

              var o = new function () {  
                var private_property = "yo";  
                this.public_method = public_method;  
                
                function public_method () { alert(private_property + private_method()); }  
                function private_method () { return private_property; }  
              };  
              o.public_method();
              

              bzw.

              var o = (function () {  
                var private_property = "yo";  
                return { public_method : public_method };  
                
                function public_method () { alert(private_property + private_method()); }  
                function private_method () { return private_property; }  
              })();  
              o.public_method();
              

              übrigens:
                function bla () {}
              ist im grunde dasselbe wie
                var bla = function () {};
              nur dass die das erste (die sog. function declaration) beim ausführen eines blocks zuerst ausgeführt wird, weshalb ich die funktionen oben am ende der funktion notieren konnte.

              oder oder ist die private methode im grunde eben kein (echter) bestandteil der "klasse"

              eine private methode ist keine wirkliche methode des öffentlich objektes. sie ist nur durch closures in den restlichen methoden verfügbar. sie http://www.crockford.com/javascript/private.html

              sondern wird lediglich im gleichen scope definiert wie die klasse bzw. das objekt

              ja

              so dass selbiges bei seiner entstehung auf die private funktion bzw. das, was darin erzeugt wird, zugreifen kann?

              ein objekt kann auf nix zugreifen. aber die funktionen, die im selben scope erzeugt werden. das hat mit OOP im grunde nichts zu tun, sondern ist ein funktionales javascript-feature - eben closures:

              http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#closures
              http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#kapselung