En JavaScript, nous avons deux façons de créer une "classe" et de lui donner des fonctions publiques.
Méthode 1 :
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
Méthode 2 :
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
J'ai lu de nombreuses fois que les gens en disant que l'utilisation de la méthode 2 est plus efficace car toutes les instances partagent la même copie de la fonction plutôt que d'avoir chacune la sienne. La définition de fonctions via le prototype présente toutefois un énorme inconvénient : elle rend impossible la création de variables d'instance privées.
Même si, en théorie, l'utilisation de la méthode 1 donne à chaque instance d'un objet sa propre copie de la fonction (et utilise donc beaucoup plus de mémoire, sans parler du temps nécessaire aux allocations), est-ce bien ce qui se passe en pratique ? Il semble qu'une optimisation que les navigateurs Web pourraient facilement réaliser consisterait à reconnaître ce modèle extrêmement courant et à faire en sorte que toutes les instances de l'objet fassent référence aux fonctions suivantes le même une copie des fonctions définies via ces "fonctions constructives". Il ne pourrait alors donner à une instance sa propre copie de la fonction que si celle-ci est explicitement modifiée par la suite.
N'importe quel point de vue - ou, encore mieux, l'expérience du monde réel - sur les différences de performance entre les deux, serait extrêmement utile.
1 votes
voir aussi Performances de l'opérateur du prototype Javascript : il économise de la mémoire, mais est-il plus rapide ?