Bonjour à tous !
Je sollicite votre aide pour répondre à une question qui me turlupine sur les objets et les fonctions en javascript. On est bien d'accord que les fonctions sont des objets, ce sont même des objets de première classe.
On sait aussi que normalement une variable qui contient un objet est une simple référence vers cet objet et ne contient pas l'objet lui-même. Le code suivant tout ce qu'il y a de plus classique :
1 2 3 4 5 6 7 8 9 10 11 12 | // on créer un objet napoleon var george = { prenom : "Bonaparte", nom : "Napoléon" }; // on créer une variable imposteur et on lui affecte l'objet napoleon var imposteur = napoleon; // on modifie le prenom de notre imposteur : imposteur.prenom = "Didier"; console.log(imposteur.prenom); // affiche bien "Didier" console.log(napoleon.prenom); // affiche aussi "Didier" car référence vers le même objet |
Jusque là, tout est normal. J'ai donc essayé de faire pareil avec des fonctions. Et là c'est le drame :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // on créer une fonction anonyme affectée à une variable bonjour var bonjour = function () { console.log("bonjour"); }; // on affecte cette fonction à une nouvelle variable bonsoir var bonsoir = bonjour; bonsoir(); // affiche bien "bonjour"; // on modifie la fonction d'origine bonjour bonjour = function () { console.log("bonsoir"); }; bonjour(); // affiche bien "bonsoir" bonsoir(); // affiche toujours "bonjour" !!! |
Manifestement notre fonction bonjour est affectée en valeur et non en référence à la variable bonsoir, ce qui explique que cette dernière n'est pas affectée par le changement. Pourtant les fonctions étant des objets, elles ne devraient pas avoir ce comportement si ? Les tableaux par exemple se comportent "correctement", c'est à dire comme des objets.
Savez vous pourquoi un tel comportement ? Existe-il d'autres objets à se comporter ainsi ?