[JavaScript] private von privilegierte Methode aus aufrufen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [JavaScript] private von privilegierte Methode aus aufrufen

    Hallo allerseits!

    Ich hab mal eine Frage zu diesem Gefüge:

    Code:
    function MyClass(){
    
      this.interval = false;
    
      this.start = function(){
        this.interval = window.setInterval("alertMe", 1000);
      }
    
      this.stop = function(){
          window.clearInterval(this.interval);
      }
    
      function alertMe(){
        alert("RING RING RING");
      }
    
    }
    Wenn ich nun start() aufrufe sagt mir firebug:
    alertMe is not defined
    ../js/myclass.js
    Line 6

    Etwas seltsam, weil alertMe in der Klasse liegt. Weiss einer Rat?

    Gruß & Thx
    zerni
    Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
    - ...und solche Behauptungen in "falsches Resourcenmanagement"

  • #2
    this.alertMe() mal ausprobiert?
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      PHP-Code:
      this.interval window.setInterval("alertMe()"1000); 
      gruß
      peter
      Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
      Meine Seite

      Kommentar


      • #4
        PHP-Code:
        var alertMe = function(){
            
        alert("RING RING RING");
          } 
        Download ET-Chat v3.x.x

        Kommentar


        • #5
          Der String, den du setInterval() übergibst muß ausführbarer Code sein. Das ist bei dir nicht der Fall. "alertMe()" würde eine Funktion aufrufen und wäre damit der Sache schon einen Schritt näher. Fragt sich nur noch, wie du "MyClass.alertMe()" aufrufen kannst oder besser noch "this.alertMe()".

          Ich sehe zwei Möglichkeiten:
          Code:
          function Nerv(myName) {
            this._interval = null;
            this._myName = myName;
          }
          Nerv.prototype._interval;
          Nerv.prototype.start = function() {
            this._interval = window.setInterval(this._myName+'.alertMe()', 2000);
          }
          Nerv.prototype.stop = function() {
            window.clearInterval(this._interval);
          }
          Nerv.prototype.alertMe = function() {
            alert('RING RING RING');
          }
          
          n = new Nerv('n');
          n.start();
          Problem hierbei: Die Methode start muß den Namen der Instanz kennen. Ich habe ihn einfach bei der Konstruktion übergeben. Aber das ist fehleranfällig und geht sowieso nur, wenn der Name bekannt ist.

          Code:
          var Nerv = {
            _interval: null,
            start: function() {
              this._interval = window.setInterval('Nerv.alertMe()', 2000);
            },
            stop: function() {
              window.clearInterval(this._interval);
            },
            alertMe: function() {
              alert('RING RING RING');
            }
          }
          
          n = Nerv;
          n.start();
          Hier gefällt mir persönlich der Aufruf in setInterval() besser, aber es leider kein Aufruf am instanziierten Objekt, sondern eher static.

          Vielleicht hat jemand noch eine bessere Idee - für mich ist es im Moment noch ein wenig früh.

          Kommentar


          • #6
            Jetzt wirkt der Kaffee langsam.

            Beim ersten Beispiel dachte ich an Reflection und fand keinen anderen Weg als den oben gezeigten. Aber jetzt fiel mir das ein:
            Code:
            Nerv.prototype.start = function() {
              var self = this;
              this._interval = window.setInterval(function(){ self.alertMe(); }, 2000);
            }
            Diese anonyme Methode kennt ihre Umgebung (Closure) und damit auch self.

            Kommentar


            • #7
              Warum alles so kompliziert?

              Das funkzt auch:
              PHP-Code:
              <script>
              function 
              MyClass(){

                
              this.interval false;

                
              this.start = function(){
                  
              this.interval window.setInterval(alertMe1000);
                }

                
              this.stop = function(){
                    
              window.clearInterval(this.interval);
                }

                var 
              alertMe = function (){
                  
              alert("RING RING RING");
                }

              }

              window.onload=function(){
               var 
              obj = new MyClass;
               
              obj.start();
              }
              </
              script
              Download ET-Chat v3.x.x

              Kommentar


              • #8
                Oder noch eleganter mit Datenübergabe an die Methode:
                PHP-Code:
                <script>
                function 
                MyClass(){

                  
                this.interval false;

                  
                this.start = function(bla){
                    
                this.interval window.setInterval(function(){alertMe(bla);}, 1000);
                  }

                  
                this.stop = function(){
                      
                window.clearInterval(this.interval);
                  }

                  var 
                alertMe = function (text){
                    
                alert("RING RING RING "+text);
                  }

                }

                window.onload=function(){
                 var 
                obj = new MyClass;
                 
                obj.start('Telefon');
                }
                </
                script
                Download ET-Chat v3.x.x

                Kommentar


                • #9
                  Original geschrieben von E.T.
                  Warum alles so kompliziert?
                  Deine Lösung ähnelt der zweiten Variante in meinem ersten Beitrag: alertMe() wird nicht an der Instanz gerufen (hat keine this Referenz).
                  Code:
                  function MyClass(){
                    this._interval = false;
                    this._alert = 'RING RING RING';
                    this.start = function(){
                      this._interval = window.setInterval(alertMe, 2000);
                    }
                    this.stop = function(){
                        window.clearInterval(this._interval);
                    }
                    var alertMe = function(){
                      alert(this._alert);  // undefined!
                    }
                  
                  }
                  
                  obj = new MyClass();
                  obj.start();
                  EDIT:
                  Gleiches gilt fürs 2. Beispiel: Kein this.
                  Btw: Mit window.setInterval(alertMe, 1000, bla); kann man auch Daten übergeben (auch im IE?).

                  Zuletzt geändert von onemorenerd; 06.03.2008, 11:01.

                  Kommentar


                  • #10
                    ok hab es jetzt erstmal so realisiert:

                    Code:
                    window.setInterval(alertMe, 2000);
                    Noch eine Frage: wie kann ich denn sowas wie eine Callback function realisieren?

                    doSomething(param1, param2, callback);

                    so??

                    Code:
                    doSomething(param1, param2, callback){
                    
                    callback();
                    
                    }
                    Zuletzt geändert von zerni; 06.03.2008, 15:36.
                    Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
                    - ...und solche Behauptungen in "falsches Resourcenmanagement"

                    Kommentar


                    • #11
                      Das ist ein typischer Anwendungspunkt von apply in javascript:
                      http://www.webreference.com/js/column26/apply.html
                      Code:
                      function MyClass(){
                       _ = this;
                       this._interval = false;
                       this._alert = 'RING RING RING';
                       this.start = function(){
                        this._interval = setInterval(function(){alertMe.apply(_)}, 2000);
                       }
                       this.stop = function(){
                        window.clearInterval(this._interval);
                       }
                       var alertMe = function(){
                        alert(this._alert);  // undefined!
                       }
                      }
                      
                      obj = new MyClass();
                      obj.start();

                      Kommentar


                      • #12
                        habt ihr evtl noch eine etwas ausführlichere Erklärung zu call() und apply()? Google ist gerade offline.. ich fühl mich direkt so unwissend

                        mit apply ist es mir aber trotzdem nicht möglich den Wert von this._alert auszugeben oder?
                        Killerspiele sollten in der Größenordnung von Kinder********************grafie eingeordnet werden.(G. Beckstein)
                        - ...und solche Behauptungen in "falsches Resourcenmanagement"

                        Kommentar


                        • #13
                          Doch, ist es. Versuche mal mein Beispiel. Mit apply und call kannst du eine Methode eines Objekt dem scope eines anderen Objekts anhängen.

                          Kommentar

                          Lädt...
                          X