Volledige versie bekijken : reference issue, wie heeft er kennis v. object-georienteerd programmeren?
sfsd
%Europe/Berlin %931 %2005, 23:21
Hallo, ik heb de volgende vraag:
In een project heb ik een 'globale' variabele:
currentPage=Array({page: 1},{info: 1});
En ergens een script met de volgende toekenning:
var pageLink=currentPage[0];
doeEenFuntie(pageLink);
Nou verandert het item gemaakt met doeEenFunctie [een movieclip], van gedrag als currentPage verandert.
Volgens de flash help komt dit waarschijnlijk omdat een toekenning met = gevolgd door een ding met een ander type als String of Number een toekenning van een referentie is ipv. een toekenning v/e waarde.
Ik heb dit geprobeerd maar dat werkte niet:
pageLink=getValue(currentPage[0]);
met:
function getValue(object:Object):Object {
var tempObject:Object = new Object();
for (var i in object) {
etc.. een langdradig verhaal waarin tempObject dezelde structuur+waardes als object krijgt
}
return tempObject.
};
het probleem blijft hetzelde, als currentPage verandert, verandert ook de pageLink-waarde v/h item gecre-eerd met doeEenFunctie();
Dus de vraag: hoe ken ik aan pageLink de waarde toe van currentPage[0] en niet de referentie ernaar? De structuur v/h project sluit helaas een andere oplossing uit.
Alvast bedankt,
S.
Dauntless
%Europe/Berlin %967 %2005, 00:13
Ik heb je post al een paar keer gelezen, maar eerlijk gezegd snap ik hem nog altijd niet :I (Ligt waarschijnlijk aan mij hoor ;) ).
Dus je hebt een global var, en die ken je op een bepaald ogenblik toe aan een andere var. Maar aan die nieuwe var heb je geen datatype hangen, hoe kan het dan een 'ander' datatype zijn als die van die global var (een object) ?
En wat bedoel je met "het item gemaakt met doeEenFunctie [Movieclip] verandert als pageLink veranderd" ?
sfsd
%Europe/Berlin %001 %2005, 01:02
Nou currentpage is een array met objecten {}, hoe die precies werken weet ik ook niet maar voor mij is het handig omdat ze weer zelf ook variabelen en variabelenamen kunnen bevatten.
Maar goed, als ik zeg
pagelink=currentPage[0];
dan wil ik dat pagelink de waardes van currentpage[0] krijgt, dit lukt wel alleen refereert het voortaan naar currentpage[0], dus als dat verandert, verandert pageLink ook, en dat wil ik dus niet.
Roenes
%Europe/Berlin %027 %2005, 01:39
Ik heb je post al een paar keer gelezen, maar eerlijk gezegd snap ik hem nog altijd niet :I (Ligt waarschijnlijk aan mij hoor ;) ).Neej hoor. Ik had hetzelfde probleem ;)
Maar goed, als ik zeg
pagelink=currentPage[0];
dan wil ik dat pagelink de waardes van currentpage[0] krijgt, dit lukt wel alleen refereert het voortaan naar currentpage[0], dus als dat verandert, verandert pageLink ook, en dat wil ik dus niet.Dat kun je volgens mij niet bereiken aangezien pagelink een referentie is naar het object. En je kunt aan een variabele niet aangeven dat zijn waarde niet mag veranderen (in tegenstelling tot java) dus kun je dit ook moeilijk voorkomen. :)
Dauntless
%Europe/Berlin %031 %2005, 01:45
Ik heb nu ook al een 3 kwartier zitten zoeken maar 'k denk ook dat het niet echt mogelijk is... De enige mogelijkheid is idd héél de object doorlopen en element voor element kopieren...
(Ik had idd ook die java methode geprobeerd, maar die werkt dus idd ook niet :( ).
Roenes
%Europe/Berlin %032 %2005, 01:47
(Ik had idd ook die java methode geprobeerd, maar die werkt dus idd ook niet :( ).Irritant he dat flash het keyword final niet ondersteund? Kan verrekte handig zijn :)
sfsd
%Europe/Berlin %036 %2005, 01:51
Ok, misschien was het niet helemaal duidelijk, maar de variabele mag natuurlijk best veranderen, alleen niet als de andere variabele verandert, maar pas als ik het zeg.
Als ik bv doe.
temp=new String("hallo");
temp2=temp;
dan is trace(temp2): hallo
en als ik doe temp="iets anders";
dan is trace(temp2) nog steeds "hallo";
Maar in mijn geval stel ik bv. temp gelijk aan een object, en op dat moment is het geen waarde-toekenning, maar een referentie-toekenning, dus als het object verandert, verandert temp ook. [Daar staat ook iets over in de 'help' bij '=' assignment]
Nou vraag ik me af, of het mogelijk is dat het niet naar het object refereert, maar slechts naar de waarde ervan, het lijkt me sterk dat dit niet kan. Desnoods met een omweg...
Dauntless
%Europe/Berlin %037 %2005, 01:53
Ok, misschien was het niet helemaal duidelijk, maar de variabele mag natuurlijk best veranderen, alleen niet als de andere variabele verandert, maar pas als ik het zeg.
Dat bedoelen we ook ;) (Dat dat dus niet echt gemakkelijk gaat)
sfsd
%Europe/Berlin %038 %2005, 01:55
Ok, vergeet mn vorige post, die is inmiddels achterhaald.
Maar element voor element kopieeren lukt ook niet op de manier beschreven in de 1e post.
Maar goed, misschien kan ik daar nog wat aan proberen te sleutelen, bedankt voor jullie tijd in ieder geval
Dauntless
%Europe/Berlin %039 %2005, 01:56
Als die functie je niet lukt kan je die ook weer posten hier op het forum, dan kunnen we daar eens naar kijken :). (Maak dan een nieuwe topic).
Roenes
%Europe/Berlin %638 %2005, 16:20
Maar in mijn geval stel ik bv. temp gelijk aan een object, en op dat moment is het geen waarde-toekenning, maar een referentie-toekenning, dus als het object verandert, verandert temp ook. [Daar staat ook iets over in de 'help' bij '=' assignment]
Nou vraag ik me af, of het mogelijk is dat het niet naar het object refereert, maar slechts naar de waarde ervan, het lijkt me sterk dat dit niet kan. Desnoods met een omweg...Je zegt in eerste instantie netjes dat je een referentie toekenning maakt en je dus naar het object refereert. Daarna geef je aan dat je dat niet wilt, maar dat je alleen een copie van de waardes van het object op een bepaald moment in tijd wilt. :)
Je moet dus idd niet naar het object refereren, maar je moet het object kopieren. Dat kan op de volgende manier:
//Originele object=
var obj = {x:10, y:5, naam:"Roenes"};
//Copieren van object
var copy = new Object();
for(var i in obj) copy[i] = obj[i];
//Tracen van nieuwe object
trace("==== COPY ====");
for(var i in copy) trace(i + " = " + copy[i]);
//Originele object aanpassen
obj.naam = "Aapje!";
obj.adres = "Bananenboom 12";
//Tracen van beide objecten
trace("");
trace("==== OBJ ====");
for(var i in obj) trace(i + " = " + obj[i]);
trace("==== COPY ====");
for(var i in copy) trace(i + " = " + copy[i]);
Dit zou je op weg moeten helpen lijkt me :)
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.