235 votes

JS - Pourquoi utiliser Prototype ?

<blockquote> <p><strong>Doublon possible :</strong><br> <a href="http://stackoverflow.com/questions/892595/javascript-prototype-inheritance">JavaScript : héritage de prototype</a> </p> <p>OK, donc je suis relativement nouveau à l’idée de la POO en JS.</p><p>Quelle est la différence entre ces 2 extraits du code :</p><pre><code></code></pre><hr><pre><code></code></pre><p>Ils font tous deux la même chose, ainsi quel est la différence ?</p></blockquote>

335voto

Adam Rackis Points 45559

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.

28voto

hugomg Points 29789

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X