Avatar billede netro Nybegynder
09. april 2007 - 17:19 Der er 19 kommentarer og
1 løsning

Tilgå variabler i klasse

Har jeg nogen mulighed for at tilgå MyVar ude fra enten direkte eller via en property?

function MyClass()
{
    var MyVar = 2;
}

Jeg ved, at jeg kan tilgå den via en metode som this.SetVar = function(Value) { MyVar = Value; } eller ved at skrive this.MyVar = 2, men er der andre løsninger?
Avatar billede erikjacobsen Ekspert
09. april 2007 - 17:30 #1
Mener du:

function MyClass()
{
    var MyVar = 2;
}

  var m = new MyClass();
  m.MyVar=7913;
  alert(m.MyVar);
Avatar billede erikjacobsen Ekspert
09. april 2007 - 17:32 #2
Ja, altså hvis man skal angive den rigtigt:

function MyClass()
{
    this.MyVar = 2;
}

En var i en funktion i Javascript, der bruges som klasse, den findes slet ikke.
Avatar billede netro Nybegynder
09. april 2007 - 19:41 #3
Det jeg gerne vil, er at kunne bruge de 7913 inde i funktionen/klassen. Her får vist 2.

function MyClass()
{
    var MyVar = 2;

    this.ShowValue = ShowValue;
    function ShowValue() { alert(MyVar); }
}

var m = new MyClass();
m.MyVar=7913;
m.ShowValue();
Avatar billede erikjacobsen Ekspert
09. april 2007 - 19:49 #4
function MyClass()
{
    this.MyVar = 2;

    this.ShowValue = ShowValue;
    function ShowValue() { alert(this.MyVar); }
}

var m = new MyClass();
m.MyVar=7913;
m.ShowValue();
Avatar billede netro Nybegynder
09. april 2007 - 20:06 #5
Det virker. Mit spørgsmål gik nok primært på, om det er muligt at undgå at sætte this foran alle variabler i klassen. Ikke at det gør det helt store. Men måske der var en tredje løsning.
Avatar billede erikjacobsen Ekspert
09. april 2007 - 20:11 #6
Det tror jeg ikke - men læs nogle gode eksempler, og følg dem.
Avatar billede netro Nybegynder
09. april 2007 - 21:10 #7
Ok. Du må gerne lægge et svar, hvis du vil have points.
Avatar billede erikjacobsen Ekspert
09. april 2007 - 21:11 #8
Jeg samler slet ikke på point, tak. Svar selv, accepter dit eget svar.
Avatar billede netro Nybegynder
09. april 2007 - 22:39 #9
-
Avatar billede netro Nybegynder
10. april 2007 - 19:43 #10
Erik? Jeg løb lige ind i et problem. Hvis jeg prøver at bruge MyVar i en ny funktion, er den pludselig "undefined". Kan du regne ud hvorfor?

function MyClass()
{
    this.MyVar = 2;

    this.ShowValue = ShowValue;
    function ShowValue2() { alert(this.MyVar); }
    function ShowValue() { ShowValue2(); }
}

var m = new MyClass();
m.MyVar=7913;
m.ShowValue();
Avatar billede erikjacobsen Ekspert
10. april 2007 - 19:50 #11
Det er normalt ikke helt sådan man putter metoder på klasser, men man kan godt:

    function MyClass()
{
    this.MyVar = 2;

    this.ShowValue = ShowValue;
    this.ShowValue2 = ShowValue2;
    function ShowValue2() { alert(this.MyVar); }
    function ShowValue() { this.ShowValue2(); }
}

var m = new MyClass();
m.MyVar=7913;
m.ShowValue();


Ellers læs fx: http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm  (Adding a Method)
Avatar billede netro Nybegynder
11. april 2007 - 19:25 #12
Tak for linket. Jeg har nu lavet lidt om, så det faktisk virker, men nu får jeg et velkendt problem ved brug af settimeout. Det vil glæde mig, hvis du også har et svar på den.

function MyClass()
{
    this.MyVar = 2;

    MyClass.prototype.ShowValue2 = function() { alert(this.MyVar); }
    MyClass.prototype.ShowValue = function() { setTimeout(this.ShowValue2, 500); }
}

var m = new MyClass();
m.MyVar=7913;
m.ShowValue();

Grunden til at jeg får en alert med "undefined" igen er vel, at metoden ikke kan findes globalt, men hvordan kan jeg løse det?
Avatar billede erikjacobsen Ekspert
11. april 2007 - 19:37 #13
Det kender jeg ikke løsningen på. Første parameter til setTimeout er en streng med at javascript-statement. Og det kan man ikke formulere som sådan i en class. Mig bekendt.
Avatar billede netro Nybegynder
11. april 2007 - 20:25 #14
Nu fandt jeg en løsning - som virker i alt andet end Explorer :(

this.ShowValue = function() { setTimeout(function(thisObj) { thisObj.ShowValue2(); }, 500, this); }
Avatar billede roenving Novice
11. april 2007 - 23:43 #15
Prøv f.eks.

me = this;
MyClass.prototype.ShowValue = function() { setTimeout('me.ShowValue2()', 500); }
Avatar billede netro Nybegynder
12. april 2007 - 00:17 #16
Ja, det virker faktisk også i IE, men kan jeg sende parametre med til ShowValue2() ??
Avatar billede roenving Novice
12. april 2007 - 00:57 #17
Det burde du kunne ved at sætte dem ind i tekst-strengen:

MyClass.prototype.ShowValue = function(myValue) { setTimeout('me.ShowValue2('+myValue+')', 500); }
Avatar billede netro Nybegynder
12. april 2007 - 19:51 #18
Det virker slet ikke for mig, når jeg sætter det i quotes. Kun sådan her:

me = this;
setTimeout(function() { me.ShowValue2(); }, 500);
Avatar billede netro Nybegynder
12. april 2007 - 20:04 #19
Nej, du har ret. Det virker også, som du skriver. Men jeg kan simpelthen ikke få til at spille, hvis ShowValue2 kalder sig selv med settimeout. Nogen idé om hvad fejlen er?

this.prototype.ShowValue2()
{
me = this;
setTimeout('me.ShowValue2()', 500);
}
Avatar billede netro Nybegynder
15. april 2007 - 00:10 #20
Min fejl. setTimeout og funktion med parametre kan gøres sådan:

setTimeout(function() { me.ShowValue2(myValue); }, 500);
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