Marco: Verständnisfrage

Hi,

folgender Codeschnippsel habe ich hier http://www.digital-web.com/articles/objectifying_javascript/ gefunden:

  
 function Animation(element){  
   var looped = 0;  
   var e = element;  
  
   function construct() {  
    this.loopCount = function() {  
     return looped;  
    }  
    this.loop = function() {  
     looped++;  
    }  
   }  
   return new construct();  
 }  
  
 var animateLogin = new Animation();  
  
 animateLogin.loop();  
  
 alert(animateLogin.loopCount()); // it's 1  
 alert(animateLogin.looped); // undefined!  

Ich verstehe denn Sinn des return new construct(): var looped und var e sind für animateLogin nicht definiert und somit privat. Was ich nicht verstehe: Dies wäre doch auch der Fall wenn man das ganze ohne Rückgabewert machen würde (also die Zeile return new construct(); entfernen würde weil die Variabeln ja ohnehin nur lokal gültig sind da sie mit var definiert wurden? Oder habe ich da etwas falsch verstanden?

Viele Grüsse
Marco

  1. Hallo,

    Ich verstehe denn Sinn des return new construct(): var looped und var e sind für animateLogin nicht definiert und somit privat. Was ich nicht verstehe: Dies wäre doch auch der Fall wenn man das ganze ohne Rückgabewert machen würde (also die Zeile return new construct(); entfernen würde

    Verstehe ich auch nicht - bloß um private Eigenschaften zu erhalten, braucht man das jedenfalls nicht. Darüber hinaus sehe ich in dieser Schreibweise keine Vorteile.

    Man ist gerade in einer Phase der Art »Toll, was man mit JavaScript alles machen kann!« - da wird mitunter unnötig komplizierter Code, der irgendwie objektorientiert aussieht, als supercool verkauft, dabei leistet er gar nichts besonderes.

    Mathias

    1. Hallo,

      Verstehe ich auch nicht - bloß um private Eigenschaften zu erhalten, braucht man das jedenfalls nicht. Darüber hinaus sehe ich in dieser Schreibweise keine Vorteile.

      Naja, man beeinflusst, was bei Instance.constructor ausgegeben wird.

      Beispiel:

        
      function AnyObject() {  
        var privateProp = "a private property";  
        
        this.publicProp = "a public property";  
        
        var privateMethod = function () {  
           alert("I am a private method.");  
        };  
        
        this.privilegedMethod = function () {  
           alert("I am a privileged method. I can call private methods. And " + privateProp + ".");  
           privateMethod();  
        };  
      }  
        
      var myObj = new AnyObject();  
      alert(myObj.publicProp);  
      myObj.privilegedMethod();  
      alert(myObj.constructor);  
      
      

      vs.

        
      function AnyObjectSec() {  
        var privateProp = "a private property";  
        
        var publicPropSec = "a public property";  
        
        var privateMethod = function () {  
           alert("I am a private method.");  
        };  
        
        var privilegedMethodSec = function () {  
           alert("I am a privileged method. I can call private methods. And " + privateProp + ".");  
           privateMethod();  
        };  
        
        var construct = function() {  
          this.publicProp = publicPropSec;  
          this.privilegedMethod = privilegedMethodSec;  
        }  
        return new construct();  
      }  
        
      myObj = new AnyObjectSec();  
      alert(myObj.publicProp);  
      myObj.privilegedMethod();  
      alert(myObj.constructor);  
      
      

      Allerdings:

        
      alert(AnyObjectSec.toString());  
      
      

      ;-)

      viele Grüße

      Axel

  2. [code lang=javascript]
    function Animation(element){
       function construct() {

    ...

    }
       return new construct();
    }

    Ehrlich gesagt 100% verstehen tu ich das auch nicht, es kommt daher http://javascript.crockford.com/prototypal.html.

    Struppi.

    --
    Javascript ist toll (Perl auch!)