La réponse courte, comme l'a dit Johannes, est presque toujours # 2. Les deux n'existeront en mémoire qu'à un seul endroit, mais les méthodes d'instance ont un contexte (qui est essentiellement un argument caché supplémentaire) qui leur donne accès à l'instance. Mais: Certains langages/environnements instancient une fonction qui ressemble (à une lecture naïve du code source) à une fonction plusieurs fois. JavaScript en est un bon exemple: l'objet fonction se referme sur la portée dans laquelle il est défini, donc s'il y a plusieurs portées (comme une fonction appelée plusieurs fois), plusieurs objets fonction distincts en résultent. (Interprètes/JIT-ers peuvent optimiser si le code est reproduit, mais sur le plan conceptuel, il est et les références de fonction diffèrent.)
Voici un exemple en JavaScript:
function foo() {
alert("hi there");
}
function buildBar(x) {
function bar() {
alert(x);
}
return bar;
}
var f1, f2;
f1 = foo;
f2 = foo;
f1();
// alerts "hi there"
f2();
// alerts "hi there"
alert("f1 === f2 ? " + (f1 === f2));
// alerts "true", there is only one `foo`
var b1, b2;
b1 = buildBar("one");
b2 = buildBar("two");
b1();
// alerts "one"
b2();
// alerts "two"
alert("b1 === b2 ? " + (b1 === b2));
// alerts "false", there are two `bar`s
Cela devient pertinent dans certaines implémentations des données d'instance "privées" en JavaScript, où les gens définissent les méthodes d'instance dans le constructeur (autant que buildBar
définit bar
) afin qu'ils aient accès aux variables privées déclarées dans le constructeur. Cela a l'effet désiré (données d'instance privées), mais l'impact de plusieurs instances de fonction - une pour chaque instance de l'objet.
Tous les compilateurs utilisent (2) –
La méthode n ° 2 semble beaucoup plus logique que la n ° 1. – Dor
@Neil, sûrement tout? Comment peux-tu être si sûr? –