[javascript] nieuw object = referentie?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • thomasikzelf
  • Registratie: Mei 2010
  • Laatst online: 03-06 22:51
hey allemaal (:,

ik ben bezig met een Physics engine in html5 canvas (gewoon om te leren)
en ik bewaar alle vormpjes in een array als object. in dat object zit ook de "draw" functie, mijn vraag:

word die functie in zijn geheel opgeslagen in een variable (of array in dit geval), of word er een referentie naar de functie gegeven?

ik kan het nergens op internet vonden, en ik wil het graag weten met oog op de grote van het object, anders sla je namelijk in een paar 100 objecten dezelfde "draw" code op terwijl je die ook als apparte functie kan maken.

ik hoop dat jullie het bechrijpen;)
alvast bedankt c:

EDIT: hmm misschien is dit meer iets voor Software Engineering & Architecture

[ Voor 6% gewijzigd door thomasikzelf op 13-06-2010 15:21 ]


Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
wacht even, je vraagt je af of objecten als reference worden opgeslagen, omdat je ander bang bent dat je steeds de definitie van een functie blijft opslaan?
volgens mij heb jij echt iets fundamenteel verkeerd begrepen.. of ik snap je vraag niet? :0

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 23-09 18:21

Sebazzz

3dp

Hij wil weten of bij dit voorbeeld:
code:
1
2
3
4
5
6
7
8
class A {
     function b(c) {
         // iets
     }
}

var a = new A();
var b = new A();

Of je als je a.b() called dezelfde geheugenruimte wordt aangesproken als je b.b() called. Dus dat de uitvoerbare code op dezelfde plaats staat.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • thomasikzelf
  • Registratie: Mei 2010
  • Laatst online: 03-06 22:51
Sebazzz schreef op zondag 13 juni 2010 @ 15:25:
Hij wil weten of bij dit voorbeeld:
code:
1
2
3
4
5
6
7
8
class A {
     function b(c) {
         // iets
     }
}

var a = new A();
var b = new A();

Of je als je a.b() called dezelfde geheugenruimte wordt aangesproken als je b.b() called. Dus dat de uitvoerbare code op dezelfde plaats staat.
jah dat ja,, op dit moment nog niet heel erg een probleem maar ik ben best benieuwd..

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 23-09 18:21

Sebazzz

3dp

Ik ben geen expert maar ik geloof dat het op machine niveau zo gaat:
code:
1
2
3
4
5
// kopieert benodigde referenties naar een geheugenruimte, zeg A

// voert code uit die uit geheugenruimte A zijn variabelen haalt

// kopieert eventueel resultaat terug

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • thomasikzelf
  • Registratie: Mei 2010
  • Laatst online: 03-06 22:51
hmmm van wat ik over andere talen kan vinden (o.a. c++ ) is dat ze members zijn met preferences (wat sebazzzz zegt), maar kan het niet echt zwart op wit vinden ):

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 23-09 18:21

Sebazzz

3dp

Je hebt daarom best kans dat het van de implementatie (dus javascript engine) afhangt. Als er een JIT compiler achter hangt zoals bij V8 en Tracemonkey zal het anders werken dan bij klassieke parsers zoals pre-IE9 Trident's Javascript engine.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 23-09 22:25
Dat is volgens mij afhankelijk van de manier waarop die objecten zijn geprogrammeerd.

JavaScript:
1
2
3
4
5
6
function Circle(x, y, r){
 this.x = x;
 this.y = y;
 this.radius = r;
 this.draw = function(){...};
};


Bovenstaande zal voor elke instance een kopie van de draw functie maken.
Om voor alle instances dezelfde draw functie te gebruiken zal deze aan de prototype van de constructor moeten worden vastgemaakt.

JavaScript:
1
2
3
4
5
6
7
function Circle(x, y, r){
 this.x = x;
 this.y = y;
 this.radius = r;
};

Circle.prototype.draw = function(){...};


Via onderstaande link nog wat zware kost over prototypal programmeren.
http://www.3site.eu/doc/

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Klaasvaak schreef op zondag 13 juni 2010 @ 17:57:
Bovenstaande zal voor elke instance een kopie van de draw functie maken.
Dit is veel te kort door de bocht. Het klopt dat de draw() methods van twee verschillende Circle objecten niet overeen komen, maar dat wil niet zeggen dat de hele functie gedupliceerd wordt. Een functieobject bevat namelijk naast zijn programmacode ook een referentie naar de scope waarin de functie gedefinieerd is. Aangezien de Circle constructor meerdere keren wordt uitgevoerd, is de scope ook iedere keer anders en daarom krijg je verschillende referenties naar de functie (a.draw != b.draw). Wat dat betreft is er dus weldegelijk wat overhead, maar zeggen dat de hele functie elke keer gekopiëerd wordt gaat wat ver.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 23-09 22:25
Daar kan je best gelijk in hebben, ik heb er niet voor doorgeleerd. Het lijkt mij desondanks niet onverstandig om functies aan de prototype te hangen. Bij een groot aantal objecten met meerdere functies, kan die overhead toch gaan tegenvallen? Vooral als je rekening wilt houden met al die internetmobieltjes.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh ik ben het verder helemaal eens met de prototype aanpak hoor, ik reageerde alleen even op die ene statement :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1