Avatar billede jakwag Nybegynder
05. maj 2003 - 15:45 Der er 14 kommentarer og
1 løsning

function?

Hey eksperter

Hvad er forskellen på at skrive:

function test(ord){
    trace(ord);
}

-og:

this.test = function(ord){
    trace(ord);
}
?

Den sidste laver i virkeligheden en method til det movieclip som den ligger inde i, men hvad gør den første, set med de object orienterede briller?

: ) Jakob
Avatar billede mat Nybegynder
05. maj 2003 - 18:31 #1
Jeg gør lige hvad jeg kan for at forvirre alle :)

Den første er en standard function den anden kaldes en function literal. Så vidt jeg kan se er en af forskellene hvornår de kan kaldes i forhold til hvornår de defineres:

a("a");
b("b");

function a(param) {
    trace (param);
}
b = function(param) {
    trace(param);
};

// output: a

..og

function a(param) {
    trace (param);
}
b = function(param) {
    trace(param);
};
a("a");
b("b");

// output: a
//      : b


Og hvis du vil tilskrive metoder til movieclips gøres det i prototypen med MovieClip.prototype.minMetode = function() {};

Den første funktions deklaration bruges også som regel som constructor når laver dine egne klasser i flash, og den anden til metoder (for at gøre forvirringen total :):

function A(navn) {
this.navn = navn;
}
A.prototype.addStilling = function(stilling) {
    this.stilling = stilling;
}

obj = new A("martin");
trace(obj.navn);
trace(obj.stilling);
obj.addStilling("studerende");
trace(obj.stilling);

Men den kunne vist ligeså godt se sådan her ud:

function A(navn) {
this.navn = navn;
}
function addStilling(stilling) {
    this.stilling = stilling;
}
A.prototype.addStilling = addStilling;

obj = new A("martin");
trace(obj.navn);
trace(obj.stilling);
obj.addStilling("studerende");
trace(obj.stilling);

Hvor man så og sige tilskriver funktionen addStilling() til addStilling pegeren i A´s prototype?

Jeg bruger for det meste den første funktions deklaration til ganske almindelige kodestumper der er smarte at samle, mens den anden er smittet af når jeg laver eventhandling på movieclips og knapper, hvor du knytter dem til objekternes instancenavne.

Jeg ved ikke om det opklarede noget som helst, men ellers kommer barklund nok og retter mig og forklarer det hele lidt bedre, jeg er ikke engang sikker på at jeg har forstået det korrekt? :)

mvh mat
Avatar billede jakwag Nybegynder
05. maj 2003 - 18:43 #2
HAHA
Tak for svaret. Jeg havde egentlig også regnet med at høre fra Barklund : )

Du er lige så meget/lidt med som jeg er, men:

this.test = function(ord){
    trace(ord);
}

Laver en method til this. Bare ikke til alle andre objecter fra samme class, men det må vel stadig være en method. eller hvad?

: ) Jakob
Avatar billede mat Nybegynder
05. maj 2003 - 19:10 #3
jow jow, men det er jo osse lidt kompliceret ;)

Jeg forstår ikke helt dit spørgsmål? hvor mener du at "this" kun refererer til et instans? inde i en anden metode eller på en timeline eller hvad?

Og jeg tror at forskellen på hvad der er en metode og hvad der er en funktion er mere eller mindre semantisk?

but who knows? :P

-mat
Avatar billede barklund Nybegynder
05. maj 2003 - 20:35 #4
Reglen er (kun som jeg plejer at anvende terminologien selvfølgelig):

En metode er en slags egenskab på et objekt, der kaldes og påvirker objektet.

En funktion er en mere eller mindre ekstern rutine, der tager nogle argumenter og returnerer et resultat - og altså ikke virker på et implicit objekt.

En rutine er blot en række operationer - som for eksempel en algoritme eller et simpelt loop.


Med hensyn til dit spørgsmål:

test = function(ord) {
    trace(ord);
}

Kan man jo også skrive. At definere funktioner på denne måde er en direkte konsekvens af, at funktioner i ECMA-262 standarden (som ActionScript og Javascript med mere stammer fra) der er funktioner "bare" en speciel variabel.

I Flash (og vist nok også javascript) har det yderligere den konsekvens, at vil man definere en funktion på et objekt, så skal det ske via variabel-tildelingen.

Altså:

System.globalTrace = function(msg){
    trace(msg);
}

Det er stadig "kun" en funktion og ikke en metode. Den er bare samlet indenfor et globalt objekt, så den ikke tilhører en specifik tidslinie.

Hvis man skriver "this" foran, så kommer funktionen til at tilhøre det objekt (eller klasse-instans) som man "har fat på". Normalt eksekveres funktioner fra en tidslinie "scope" (vinkel), men det kan være andre steder:

Foo = function() {
    this.bar = function() {
        trace("bar() in foo");
    }
}
var minFoo = new Foo();
minFoo.bar();

"Metoden" bar() tilhører altså objekt-instansen "minFoo" og ikke tidslinien, den er skabt på.

Og sådan kan man definere metoder på objekter, men problemet er, at der eksisterer en version af funktionen for hvert eneste objektet, der kreeres af klassen. Hvis metoden blev defineret via prototypen-kæden, så eksisterer metoden kun én gang, som alle instanser/objekter benytter sig af.

En klasse kan også have en "statisk metode" (som det hedder fra Java-jargonen), men det er nu nærmere at betragte som en funktion:

Foo = function() {}
Foo.bar = function() {
  trace ("static Foo.bar()");
}
Foo.bar();
var minFoo = new Foo();
minFoo.bar(); //findes ikke!

De findes altså ikke på instanserne, men kun "globalt" direkte på klasse-definitionen.

/Barklund
Avatar billede mat Nybegynder
05. maj 2003 - 20:49 #5
"En metode er en slags egenskab på et objekt, der kaldes og påvirker objektet.

En funktion er en mere eller mindre ekstern rutine, der tager nogle argumenter og returnerer et resultat - og altså ikke virker på et implicit objekt."

Den er købt! :)

Men er det ikke rigtigt at det som java-folk kalder en metode kalder c++ folk en funktion? eller forveksler jeg det med c terminologi? Vores undervisere har ihvertfald en tendens til at sidestille begreberne.

(undskylder hvis jeg spørger dumt her :)

mvh mat
Avatar billede barklund Nybegynder
05. maj 2003 - 21:11 #6
Nu har jeg heldigvis aldrig lavet særligt meget i C++, og i C er der ingen objekter, så det skal jeg ikke kunne sige. Selv er jeg også dårlig til at holde terminilogien strikt, men i rapporter, så er det et must :)
Avatar billede jakwag Nybegynder
05. maj 2003 - 21:38 #7
Barklund: jeg er ikke sikker på at jeg helt køber den.

Du vil altså påstå at det der afgør om det er en funktion eller en metode er hvad den gør, og ikke hvordan den er blevet defineret.

myClip_mc.test = function(para){
    this._x += para
}

er altså en metode, mens:

myClip_mc.test = function(para){
    trace(para);
}

-kun er en funktion?
Avatar billede mat Nybegynder
05. maj 2003 - 21:48 #8
Det er jo ikke "this" der afgør om det er en metode eller en funktion? der er da ingen forskel på dine to eksempler (ihvertfald ikke i hvad de er)?!?

"this" er et scope issue.
Avatar billede barklund Nybegynder
05. maj 2003 - 22:01 #9
En metode ændrer et objekt's tilstand med en eventuel sideeffekt, mens en funktion blot er en "sideeffekt" og ikke ændrer det eventuelle objekt, som den er defineret på.

Så ja, i dit eksempel er det som du siger!

I hvert fald som jeg vil definere termerne... :)
Avatar billede mat Nybegynder
05. maj 2003 - 22:11 #10
hm, i mit hovede er en metode noget som gælder alle instancer af en klasse, eller det som karakteriserer en klasses egenskaber eller formåen? Så hvis myClip_mc er en klasse så synes jeg at det er en metode, hvis det er et instans af klassen movieclip som du giver en funktion ville jeg kalde det en funktion.....lidt ala det der intern/ekstern halløj? men det kunne være jeg skulle korrigere mit hovede :D

En .toString() i java er da en metode, men den ændrer ikke objektets tilstand, den spytter blot noget data ud om denne? Og hvad med getters, de ændrer da heller ikke noget, men jeg kalder dem metoder?

puha forvirrende :)

mvh mat
Avatar billede barklund Nybegynder
05. maj 2003 - 22:26 #11
Tja, det er lidt kompliceret - især for flash, hvor man ikke kan have en funktion uden den hører til et eller andet objekt... :)

og med hensyn til toString() så er den jo afhængig af objektets tilstand og ikke bare en statisk funktion.

Måske skal vi sige:

resultatet af en metode er forskellig for forskellige objekter (= objekter med forskellig intern tilstand) hvor en funktion kaldt fra forskellige objekter af samme klasse har samme resultat, ok? :)
Avatar billede jakwag Nybegynder
06. maj 2003 - 08:56 #12
Okay, dine sidste to linier giver mening.
En method, er en funktion der forholder sig til et objects properties, og enten returnere eller ændre disse.

Den er købt, lav et svar.

Og tak til jer begge for de lange svar, jeg har nok været lidt fedtet med pointene til dette spørgsmål, sorry : )
Avatar billede barklund Nybegynder
06. maj 2003 - 13:50 #13
Et svar :)
Avatar billede barklund Nybegynder
06. maj 2003 - 14:31 #14
Hvad med mat?
Avatar billede jakwag Nybegynder
06. maj 2003 - 14:38 #15
Hovsa!
:D

Her er til dig, Mat: http://www.eksperten.dk/spm/349177
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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