hjælp med objekter i javascript!

Tags:    javascript

ok jeg er begyndt at lege lidt med firefox extensions, der udvikles i javascript og XML...

jeg er helt ny til javascript, og er rendt ind i nogen problemer! jeg har nemlig meget svært ved at fatte det med objekter og event listeners!

jeg har den følgende kode (fra en tutorial):

Fold kodeboks ind/udKode 


jeg har forstået det sådan her, ret mig hvis jeg tager fejl:
gtfx er et objekt?
funktionerne er faktisk ikke funktioner men "properties"?

og der går jeg så i stå!
min event listener, har noget med "onLoad" at gøre right?
hvorfor skal den så kaldes, ved alle min funktioner? :S :$

jeg håber at der er en af jer der kan forklare mig det, så jeg forstår det!
hvis i tilfældigvis skulle have erfaring med C++, ville det være en stor hjælp hvis i kunne sammenligne det med C++, i forklaringen, da det er det sprog jeg er vandt til!

på forhånd: Tak :D



Indlæg senest redigeret d. 16.02.2009 06:54 af Bruger #11072
> gtfx er et objekt?

ja

> funktionerne er faktisk ikke funktioner men "properties"?

Nej de er begge dele. gtfx er et objekt, gtfx har en property ved navn onLoad, og denne property onLoad har en værdi, som er en funktion.

> min event listener, har noget med "onLoad" at gøre right?

Din event listener venter på en event kaldet "load", og kalder funktionen gtfx.onLoad, når dette sker.

> hvorfor skal den så kaldes, ved alle min funktioner?

Det spørgsmål forstår jeg ikke. Hvor kalder du hvad?



se min event listener ser sådan her ud:

window.addEventListener("load", function(e) { gtfx.onLoad(e); }, false);
første argument er "load"... jeg går ud fra at det betyder at den bliver triggered når siden indlæses?
andet argument er "function(e) { gtfx.onLoad(e); }"
sådan som jeg har forstået det, er det funktionen der bliver kaldt, når siden loader?
altså en funktion med navnet "function" som tager et argument "(e)"...
denne function kalder så igen "onLoad" funktionen... eller hvad?

og det jeg mener med at den skal kaldes ved alle mine funktioner, er at alle mine funktioner bliver deklareret med "function(e)", altså sådan her:
funktionsNavn: function(e){ ... }
hvor jeg nok ville have gjort det sådan her:
function FunctionsNavn(p1, p2, p3){ ... }

men det virker åbenbart ikke når det i inden i et object :S

og jeg er godt klar, over at min post overhovedet ikke gav mening, men det er sku også lidt svært at forklare det, når man ikke engang selv fatter det :S

håber i kan forklare det til mig så jeg forstår det :)

på forhånd: Tak :D





Indlæg senest redigeret d. 18.02.2009 06:05 af Bruger #11072
se min event listener ser sådan her ud:

window.addEventListener("load", function(e) { gtfx.onLoad(e); }, false);
første argument er "load"... jeg går ud fra at det betyder at den bliver triggered når siden indlæses?
andet argument er "function(e) { gtfx.onLoad(e); }"
sådan som jeg har forstået det, er det funktionen der bliver kaldt, når siden loader?
altså en funktion med navnet "function" som tager et argument "(e)"...
denne function kalder så igen "onLoad" funktionen... eller hvad?


Næsten korrekt. Funktionen hedder ikke "function". "function" er bare et keyword, som fortæller at det er en funktion. Funktionen har ikke noget navn.

En funktion er et specielt slags objekt. Man kan altså tage en funktion og gemme den i en variabel.


og det jeg mener med at den skal kaldes ved alle mine funktioner, er at alle mine funktioner bliver deklareret med "function(e)", altså sådan her:
funktionsNavn: function(e){ ... }
hvor jeg nok ville have gjort det sådan her:
function FunctionsNavn(p1, p2, p3){ ... }

men det virker åbenbart ikke når det i inden i et object :S


Funktionerne skal i dit tilfælde tildeles egenskaber i dit objekt. Hvis du opretter funktionerne på den måde du har angivet, så kan du ikke gøre det inden i din initialisering af dit gtfx-objekt. En sådan initialisering skal altid have syntaksen:

myObject = {myPropertyKey1: myPropertyValue1, myPropertyKey2: myPropertyValue2, ...};

Hvis du opretter dine funktioner på den måde du har angivet (altså "function myName(arg1, arg2) {...}"), så skal de heller ikke kaldes som gtfx.onLoad(e) men som onLoad(e), da de så ikke længere vil være properties på dit gtfx-objekt.



jeg tror næsten jeg har forstået det nu :D
så man kunne også gøre sådan her fx:

myPropertyKey1: Bool = false;
myProbertyKet2: int = 21;

?
eller har jeg misforstået noget?

og en anden ting jeg ikke forstår: hvis 'function' bare er et keyword, hvordan kan det så tage et argument (e)?

og et sidste spørgsmål (for nu, ihvertfald): hvis jeg vil tilføje mine egne argumenter, kan det så bare gøres sådan her:

propertyKey: function(e, arg2, arg3) { ... }
?

på forhånd: Tak :D





Indlæg senest redigeret d. 21.02.2009 10:36 af Bruger #11072

så man kunne også gøre sådan her fx:

myPropertyKey1: Bool = false;
myProbertyKet2: int = 21;

?
eller har jeg misforstået noget?


Det kan man ikke. Der har været en del snak om det, og der er planer om at understøtte det i ECMA-Script 4.0, men det varer mange år før det kommer. Nyeste version af Flash ActionScript understøtter vidst noget lignende, men det er ikke noget der findes i Firefox (endnu).


og en anden ting jeg ikke forstår: hvis 'function' bare er et keyword, hvordan kan det så tage et argument (e)?


Det er fordi funktionen ikke har noget navn. Konstruktionen returnerer en reference (hedder vidst en pointer i C) til den unavngivne funktion.

Følgende linjer er (næsten) identiske:

function myFunc(a, b) { return a + b; }
var myFunc = function(a, b) { return a + b; }


og et sidste spørgsmål (for nu, ihvertfald): hvis jeg vil tilføje mine egne argumenter, kan det så bare gøres sådan her:

propertyKey: function(e, arg2, arg3) { ... }
?


Ja



t