Avatar billede scirkuit Nybegynder
14. december 2004 - 23:54 Der er 5 kommentarer og
1 løsning

brug af .this til at referere til parent object fra event kode

Mit problem er demonstreret i koden neden for.

Jeg har en constuctor til et object (myObject)
denne constructor har noget data (this.string) og en metode (this.method).

Når siden er loadet instantierer jeg et object (myObjectInstance) med constructoren (myObject).

Jeg vil nu have adgang til myObjectInstance.string fra metoden myObjectInstance.method(), og som det ses i metoden, prøver den at få adgang til string variablen ved at referere til den med this.string.

Dette virker også fortræffeligt, hvilket demonstreres med en alert så snart siden er loadet.

Problemet opstår når myObjectInstance.method() kaldes fra en browser event (her documen.onmousedown).

Som det ses hvis man klikker på siden, kan this.string ikke længere bruges til at få fat i string dataen.

Dette kan omgås med en statisk reference som også er demonstreret i eksemplet, men det virker selfølgelig ikke hvis man instantierer objectet flere gange.

Hvordan kommer jeg uden om dette problem?

Eksempel:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <script type='text/javascript'>

      function myObject() {
        this.string = "the info";
        this.method = function() {
          var me = myObjectInstance;
          alert("Using 'this' returns: ["+this.string+"] But using a static reference returns: ["+me.string+"]");
        }
      }

      var myObjectInstance;

      function pageInit() {
        myObjectInstance = new myObject();
        document.onmousedown = myObjectInstance.method;
        myObjectInstance.method();
      }

    </script>
  </head>
  <body onload='pageInit()'>
  </body>
</html>
Avatar billede olebole Juniormester
15. december 2004 - 00:28 #1
<ole>

var me = this;  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
15. december 2004 - 00:33 #2
nå ja ... og så pak handleren in i en anonym funktion:


        document.onmousedown = function() {
            myObjectInstance.method();
        }
Avatar billede scirkuit Nybegynder
15. december 2004 - 00:51 #3
Yes! pak den ind i en anonym funktion!
det var svaret.
for fanden det var simpelt.

nogen anelse om hvorfor det er nødvendigt?
Avatar billede scirkuit Nybegynder
15. december 2004 - 00:52 #4
hmm, ok jeg accepterede det forkerte svar, men det var samme person, så det gør nok ik så meget.
Avatar billede olebole Juniormester
15. december 2004 - 01:10 #5
Hvis du ikke bruger den anonyme funktion, vil 'this' referere til det objekt, der er kilde til event'en ... dokumentet ved 'document.onmousedown'. En meget god måde at debugge på, hvis man er i tvivl, ser sådan ud:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <script type='text/javascript'>

      function myObject() {
        this.string = "the info";
        this.method = function() {
          var me = this;
// -- Debug -- START --
          var s = "";
          for (x in this) {
              s += x + " => " + this[x] + "<br>\n";
          }
          var win = window.open("","win");
          with (win.document) {open();write(s);close()};
          win.focus();
// -- Debug -- SLUT --
        }
      }

      var myObjectInstance;

      function pageInit() {
        myObjectInstance = new myObject();
        document.onmousedown = myObjectInstance.method
        myObjectInstance.method();
      }

    </script>
  </head>
  <body onload='pageInit()'>
  </body>
</html>

... og tak for points  ;o)
Avatar billede olebole Juniormester
15. december 2004 - 01:12 #6
Det nye dokument, der åbnes, lister alle properties og methods på det objekt, der ligger i referencen 'this'
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester