Avatar billede argmhz Nybegynder
04. juli 2007 - 10:13 Der er 10 kommentarer

klasser og setTimeout

Hej jeg sidder lige med et lille problem i javascript
jeg har bygget en række funktioner som virker perfekt og vil lave dem til en klasse
problemet er så at i en af funktionerne bruger jeg setTimeout ikke et problem i sig selv men når den skal kalde den funktion den stå i hvordan skal man så gøre:

setTimeout('this.func()',1) // siger det ikke er en function
setTimeout('func()',1) // siger den ikke er defineret
setTimeout('this.func',1) // gør ingen ting
setTimeout('func',1) // gør ingen ting

hvis ikke der findes en løsning så måske et alternativ!!!
Avatar billede olebole Juniormester
04. juli 2007 - 15:06 #1
<ole>

Du skal oprette en variabel, der refererer til objekt-instansen:

<script type="text/JavaScript">
function MyObj() {
    var me = this;
    this.foo = function(){
        alert("Du har kaldt metoden foo på en instans af MyObj");
    }
    this.bar = function(){
        setTimeout(function(){me.foo()}, 1000)
    }
    return this;
}

var oObj = new MyObj();
</script>

<button onclick="oObj.bar()">TEST</button>

/mvh
</bole>
Avatar billede olebole Juniormester
04. juli 2007 - 15:10 #2
- men du opretter en closeure i metoden bar. Den slags kan IE ikke slette i hukommelsen, hvilket resulterer i et mindre memory-leak i IE.

At give dig den lange forklaring med løsninger på fejl/uhensigtsmæssigheder/mangler i IE's garbage-collection vil dog føre for vidt her - så du må finde dig i 'hukommelsestabet'  =)
Avatar billede montago Praktikant
06. juli 2007 - 13:07 #3
jeg har gjort det sådan her:


function MitObject(){
  this.Method = function(){
    setTimeout('MitObject.Method ()',500);
  }
}


du kan også bruge objectet bagefter:


function MitObject(){
  this.Method = function(){
    //tingeling
  }
}

var MO = new MitObject()
document.setInterval(MO.Method(), 500)

derefter skal man så evt stoppe den løkke med stop kommandoen
Avatar billede olebole Juniormester
06. juli 2007 - 13:20 #4
montago >> Det er forkert. Dit første eksempel kalder ikke den rigtige metode ... nemlig metoden på instansen. I stedet kalder den en statisk metode på object-constructor'en. Det er to helt forskellige ting!

Det andet eksempel er en helt anden situation, end den spørgeren sidder med
Avatar billede montago Praktikant
06. juli 2007 - 14:34 #5
Ole: som sagt har jeg selv fået det til at virke på den måde... kommer an på hvor mange objekt-instanser der skal laves...

det andet eksempel vil kunne løse problemet i den henseende at objectet skal refresh hele tiden... så denne vil også du...

problemet der beskrives minder meget om min løsning... kommer an på hvad han vil...
Avatar billede olebole Juniormester
06. juli 2007 - 14:47 #6
"Ole: som sagt har jeg selv fået det til at virke på den måde... kommer an på hvor mange objekt-instanser der skal laves..."

Med al respekt: Du har ikke forstået det første af objekt-orienteret programmering! Det er noget lodret vrøvl, du skriver ... det kommer absolut ikke anpå, hvormange instanser, der skal laves. Hvorfor i alverden skulle antallet have indflydelse?

Hvorfor tester du ikke bare det, du skriver? Prøv at skrive:

<script type="text/JavaScript">
function MitObject(){
  this.Method = function(){
    setTimeout('MitObject.Method()',500);
  }
}

var o = new MitObject();
o.Method();
</script>

- og se, hvad der (ikke) sker  ;o)

De to næste linjer i din kommentar er ligeledes noget vrøvl, men dine misforståelser grunder sikkert i manglende OOP-oveblik/viden  =)
Avatar billede montago Praktikant
06. juli 2007 - 15:08 #7
Ole: Javascript er altså ikke direkte OO, man kan lave kode som minder om OO med mange af grundprincipperne... men det er ligeså nemt at lave hacked kode som VIL virke...

som sagt har jeg selv fået tingene til at virke mit skrevne eksempel !

og jo, jeg ved godt det er nasty måde at håndtere objekter på...
Avatar billede montago Praktikant
06. juli 2007 - 15:10 #8
se evt mit JS spil: http://www.mdk-photo.com/blocks hvor jeg i AI() metoden bruger mit eksempel: http://www.mdk-photo.com/blocks/source.js
Avatar billede montago Praktikant
06. juli 2007 - 15:34 #9
fx:

<script type="text/JavaScript">
function game(){

    this.AI = function(){
        alert("asd")
        setTimeout("Game.AI();",1500)
    }
}

var Game = new game();
Game.AI();
</script>
Avatar billede olebole Juniormester
07. juli 2007 - 10:15 #10
Jeg ved udmærket godt, at JS ikke er objekt orienteret, men objekt baseret ... baseret på prototyping. Det gør nu ikke, at man ikke kan skrive kode, der ligner OO til forveksling

Det, du laver i dit sidste eksempel, ligner _absolut_ ikke OO ... og så er det noget komplet andet end det, du skrev før. Dét kan nemlig _aldrig_ komme til at virke.

Din 'løsning' kræver jo, constructor'en iforvejen kender navnet på instansen. Så fjerner du jo enhver grund til at bruge objekter. Til gengæld får du dig en laaaaaaaang tur over åen ... for at hente et snapseglas vand. det er kort og godt rigtig skidt kode!

Hvorfor ikke bare bruge den metode, jeg begyndte denne tråd med? Det er den, der er de facto standard blandt JS-kodere ... og så kan den bruges til noget fornuftigt  =)
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