Object Oriented Programming

Status
Niet open voor verdere reacties.

ErikBooy007

Terugkerende gebruiker
Lid geworden
24 mei 2007
Berichten
3.814
Ik ben maar eens weer begonnen met een beetje javascript om mijn javascriptkennis bij te spijkeren. Uiteindelijk heb ik het spel Sokoban in JavaScript geschreven. Ik heb nu niet bepaald de mooiste technieken gebruikt (ga het waarschijnlijk nog een keer doen, maar dan met een canvas), maar het was vooral om het OOP een beetje onder de knie te krijgen.

Daarover heb ik een vraag. Ik heb de volgende klasse:

[JS]var Game = function() {

this.properties = [];
this.properties.width = 600;
this.properties.height = 400;
this.properties.resolution = 25;
this.properties.x = this.properties.width / this.properties.resolution;
this.properties.y = this.properties.height / this.properties.resolution;
this.player = [];
this.player.pos = [10,2];
this.player.prevpos = [10,2];
this.player.nextpos = [0,0];
this.moveblock = false;

this.map = [

w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,
w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,b,f,b,f,b,f,b,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,s,s,s,s,w,
w,w,w,w,w,w,w,w,f,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w

];
this.curmap = [

w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,
w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,b,f,b,f,b,f,b,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,w,
w,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,s,s,s,s,w,
w,w,w,w,w,w,w,w,f,w,w,w,w,w,w,w,w,w,w,w,w,w,w,w

];

var map = this.map;
this.getSpots = function(){
var spots = [];

for ( var i in map ) {
if ( map == s ) {
spots.push(i);
}
}

return spots;
}

}[/JS]

Het punt is zoals je kunt zien dat ik de map hier twee keer definieer. De reden daarvoor is dat ik een reference naar de map in de huidige staat wil hebben en een reference naar de oorspronkelijke map. Ik had eerst

[JS]
this.curmap = this.map;
[/JS]

gebruikt, maar het vreemde (althans in mijn ogen) was, dat als ik een waarde in de curmap array overschreef, deze ook in de map array werd overschreven.

Nu bedacht ik mij net, dat ik natuurlijk ook een private var van die array kan maken en dan aan beide public vars kan toewijzen. Toch ben ik benieuwd waarom het zo werkt dat deze vars als het ware synchroniseren.

[EDIT]
Het staat overigens hier: www.uselessapps.net/JS_Games/Sokoban
[/EDIT]
 
Laatst bewerkt:
Heb je ooit met java gewerkt, dan heb je dit vaker: de clonewars! (okay dat was een grap). Het idee is dat
[JS]this.curmap = this.map;[/JS]
een referentie maakt - niet de waarde overneemt.

Wat je dus bijvoorbeeld kan doen (dit is mij aangeleerd in java-klas) is een clone methode maken op een array. Zoiets:

[JS]Array.prototype.clone = function()
{
//omslachtig, maar het gaat om het idee!

var ret = []; //array om terug te geven
var i, l = this.length; //originele array lengte

for(i=0; i<l; i++)
{
ret.push(this); //oid
}

return ret; //returnt dus je NIEUWE array
}[/JS]
nu moet je alleen wel even oppassen met multi-dimentionale arrays denk ik. In ieder geval, nu kan je dus zoiets doen:[JS]this.curmap = this.map.clone();[/JS]



zoiets moet werken, hoewel ik niet helemaal zeker ben.

:thumb:
 
Laatst bewerkt:
Ja, een Array is een object en je definieert dus alleen verwijzingen naar het object. Het Prototype Framework heeft bijvoorbeeld een clone functie voor het kopiëren van objecten.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan