Réponses
Trop de publicités?En utilisant le prototype fait pour accélérer la création de l'objet, étant donné que la fonction n'a pas à être re-créé à chaque fois qu'un nouvel objet est créé.
Lorsque vous faites cela:
function animal(){
this.name = 'rover';
this.set_name = function(name){
this.name = name;
}
}
L' set_name
fonction est créée de novo chaque fois que vous créez un animal. Mais quand vous faites cela
animal.prototype.set_name = function(name){
this.name = name;
}
La fonction n'a pas à être re-créé à chaque fois; il existe en un seul endroit dans le prototype. Ainsi, lorsque vous appelez someAnimal.set_name("Ubu");
le this
contexte sera défini en someAnimal
et (le seul et unique) set_name
fonction sera appelée.
Il y a un avantage de l'utilisation de la première syntaxe: fonctions créées de cette manière, vous avez accès aux données privées:
function animal(){
var privateData = 'foo'
this.name = 'rover';
this.set_name = function(name){
this.name = name;
alert(privateData); //will alert 'foo'
}
}
Douglas Crockford appels de fonctions créées comme ce "privilège" pour cette raison: ils ont accès à la fois publics et privés de données.
Dans le premier exemple, chaque animal possède une propriété dans la set_name fonction, tandis que dans le deuxième exemple, ils partagent la même fonction par l'intermédiaire de leur prototype.
L'avantage de la première version, c'est que les méthodes d'accès local (privé) les variables déclarées à l'intérieur du constructeur.
L'avantage de la deuxième méthode, c'est qu'il a besoin de moins de mémoire (puisque vous n'magasin de la méthode une fois au lieu de un million de fois) et est plus performatic en courant JS moteurs.
L'utilisation de la deuxième méthode, vous pouvez également modifier ou d'ajouter des méthodes à une classe d'une manière qui affecte également les instances qui ont déjà été créés.