
Envoyé par
p3ga5e
...
est équivalent, au niveau mémoire de :
{ '0' : 0x5b, '1' : 0xe3, length : 2 }
...
Archi Faux
les deux ont des implémentation mémoire très différentes.
les méthodes applicables sont différentes.
pour ta question sur les choix d'implémentations de
1 2
| monClient.get("id")
monClient.id |
javascript le fait nativement ou presque
monClient.get = function(key) {return this[key];};
si tu analyse se code d'un point de vu C++ cela revient à affecter au membre get de monClient un pointeur sur la fonction anonyme.
en js pour généraliser ça à plusieurs objet on va faire un prototype (constructeur) tout comme en C++ tu ferait une classe.
1 2 3 4 5
| Client = function(id, name){
this.id = id;
this.name = name;
this.get =function(key) {return this[key];};
} |
Ainsi tes membres sont définis une fois pour construire ton objet comme en C++ tu utilise new
var monClient = new Client(1, "foo");
en mémoire outre les élément propres à JS tu vas avoir une allocation pour ton objet se réduisant à un pointeur vers un Number (pas de type simple en JS les nombre sont des objets) un pointeur vers la String "foo" et un pointeur vers le prototype
donc question mémoire pas beaucoup de question à se poser.
JS est un gros tas de pointeurs et de références.
Tous sont des pointeurs ou des références vers quelque chose qui s'apparente à un super void* ou void& ils peuvent pointer ou référenser indiférement des objets ou des fonctions
si tu fais
1 2 3
| fonction toto() {...};
var test1 = {"id":1, "name": "foo", get:toto};
var test2 = {"id":2, "name": "oof", get:toto}; |
tu vas définir une référence toto sur une fonction
deux référence test1 et test2 vers deux objets
ces deux objets ont trois référence id vers un number, name vers une string et get qui a la même valeur que toto (référence la même fonction)
si utilise le constructeur comme ci dessus
tu as crée une référence vers le constructeur Client
deux référence test1 et test2 vers deux objets
ces deux objets ont trois référence id vers un number, name vers une string et __proto__ qui référence Client
JS utilise un compteur de références lors un objet ou groupe d'objet n'est plus référencé il est supprimé de la mémoire.
toute référence peut être réaffecté à tout moment.
du coup mise à part lorsqu'on charge énormément d'objet et qu'on garde une référence sur chacun la gestion de la mémoire ne pose pas trop de pb.
lorsqu'on viens de C++ il faut se méfier d'une chose
la portée des variables
1 2 3 4 5 6
| function test(){
var attentionALaPortee = 45;
document.getElementById("test").onclick=function(){
alert(attentionALaPortee);
}
} |
dans ce test on défini dans la fonction test une variable celle-ci a une portée dans toute la fonction test.
la fonction cherche l'élément test et lui ajote un handler sur la variable attentionALaPortee
on est toujours dans la fonction test donc la variable est bien dans la portée.
puis on sort de la fonction test. la variable attentionALaPortee n'est pas référencé et n'est plus dans la portée. on pourait penser qu'elle est détruite.
que se passerait si on activait le clic ?
le test montre que l'alert affiche la variable attentionALaPortee elle n'a pas été détruite.
zn fait utiliser une variable au travers de sa portée comme on le fait dans ce test revient à la référencer.
globalement pas de grosse difficulté avec la mémoire en JS mais quelques attentions lorsqu'on manipule les portées
pour bien comprendre je vous conseille de lire la théorie des langages plus particulièrement la notion de closure (fermeture) tous les langage qui utilise cette notion ont quelque part un moyen de référencer les objets methodes de façon indirecte.
A+JYT
Partager