web-dev-qa-db-fra.com

Qu'est-ce que cela signifie que Javascript est un langage basé sur un prototype?

On dit que l’un des principaux avantages de Javascript est qu’il s’agit d’un langage basé sur un prototype.

Mais qu'est-ce que cela signifie que Javascript est basé sur un prototype, et pourquoi est-ce un avantage?

245
Jonas Pegerfalk

L'héritage prototype est une forme de réutilisation de code orienté objet . Javascript est l'un des seuls langages [grand public] orientés objet à utiliser l'héritage prototypique. Presque tous les autres langages orientés objet sont classiques.

Dans héritage classique , le programmeur écrit une classe, qui définit un objet. Plusieurs objets peuvent être instanciés à partir de la même classe, vous avez donc un code à un endroit qui décrit plusieurs objets dans votre programme. Les classes peuvent ensuite être organisées dans une hiérarchie, favorisant la réutilisation du code. Le code plus général est stocké dans une classe de niveau supérieur, à partir de laquelle les classes de niveau inférieur héritent. Cela signifie qu'un objet partage le code avec d'autres objets de la même classe, ainsi qu'avec ses classes parentes.

Sous la forme d'héritage prototype , les objets héritent directement d'autres objets. Toutes les affaires concernant les cours disparaissent. Si vous voulez un objet, vous écrivez simplement un objet. Mais la réutilisation de code est toujours une chose précieuse, donc les objets sont autorisés à être liés entre eux dans une hiérarchie. En javascript, chaque objet possède un lien secret avec l'objet qui l'a créé, formant une chaîne. Lorsqu'un objet est demandé à une propriété qu'il n'a pas, son objet parent sera demandé ... continuellement jusqu'à la chaîne jusqu'à ce que la propriété soit trouvée ou jusqu'à ce que l'objet racine soit atteint.

Chaque fonction en JavaScript (qui sont des objets eux-mêmes) a en fait un membre appelé "prototype", chargé de fournir des valeurs lorsqu'un objet leur est demandé. Avoir ce membre permet au mécanisme de constructeur (par lequel les objets sont construits à partir de fonctions) de fonctionner. L'ajout d'une propriété au prototype d'un objet fonction le rendra disponible pour l'objet construit, ainsi que pour tous les objets qui en héritent.

Avantages

Il peut ne pas y avoir de règle absolue quant à la raison pour laquelle l'héritage prototypal est une forme avantageuse de réutilisation de code. La réutilisation de code elle-même est avantageuse, et l'héritage prototype est une façon sensée de s'y prendre. Vous pourriez faire valoir que l'héritage prototypique est un modèle assez simple de réutilisation de code, et que ce code peut être fortement réutilisé dans manières directes . Mais les langues classiques sont certainement capables de le faire aussi.

Note: @ Andrew Hedges fait un bon point, qu'il y a en réalité plusieurs prototypal langues. Il est intéressant de noter que ces autres existent, mais il convient également de noter qu'aucun d'entre eux n'est proche du courant dominant. NewtonScript a semblé avoir un peu de traction pendant un moment, mais est mort avec sa plate-forme. Il est également possible d'étendre certaines langues modernes de manière à ajouter des capacités de prototypage.

278
keparo

Un langage basé sur un prototype ne fait pas la distinction entre classes et objets: il a simplement des objets. Un langage basé sur un prototype a la notion d'objet prototypique, un objet utilisé comme modèle à partir duquel obtenir les propriétés initiales d'un nouvel objet. Tout objet peut spécifier ses propres propriétés, que ce soit lors de sa création ou lors de son exécution. De plus, tout objet peut être associé en tant que prototype pour un autre objet, ce qui permet au second objet de partager les propriétés du premier objet.

52
Guido

La programmation basée sur des prototypes est un style de programmation orientée objet dans laquelle les classes ne sont pas présentes et où la réutilisation des comportements (ou l'héritage dans les langages basés sur les classes) est réalisée en clonant des objets existants qui servent de prototypes.

31
CMS

L’avantage/désavantage est que nous pouvons créer de nouveaux types d’objets au moment de l’exécution sans avoir à définir de classes (code statique). Comme la plupart des fonctionnalités, il appartient au développeur d’en faire un avantage/un inconvénient.

Ce qui précède est possible car les objets sont essentiellement des fonctions du script Java (aussi des fermetures)).

10
questzen

Si vous utilisez uniquement des objets au moment de l'exécution au lieu d'une classe lors de la compilation pour créer de nouveaux objets, cela ouvre la possibilité d'étendre un objet sans en connaître les détails. Bien sûr, cela peut devenir un inconvénient assez rapidement en fonction de l'utilisation. Je ne fais aucune hypothèse à propos de la langue, elle est donc applicable aux langues autres que le javascript qui ne sont pas aussi dynamiques.

myobject.prototype=unkownobject;
myobject.newproperty=1;

Vous pouvez obtenir l'objet de presque n'importe où; votre propre code, depuis le réseau, depuis la base de données, depuis un lien externe, etc.

Notez qu’un langage n’a pas à implémenter un prototype d’héritage tel que javascript. En javascript, un objet prototype est simplement partagé, ainsi que ses propriétés, parmi les héritiers. L'alternative consiste à copier toutes les propriétés du prototype dans le nouvel objet. Chaque approche a ses points forts dans des situations différentes. J'aime la seconde plus mais ce n'est pas ce que javascript fait.

5
artificialidiot

Au lieu de déclarer une structure de classe, vous pouvez créer des objets du même type et ajouter leur définition à tout moment à l'aide du prototype de l'objet. C'est plus flexible que la manière normale de faire les choses.

5
Greg

Après avoir lu toutes les réponses, voici la conclusion

1) Héritage dans lequel les objets sont hérités directement d'autres objets

2) qui n'utilise pas de classes

3) Également appelée programmation basée sur une instance ou programmation orientée prototype sans classe

4) La réutilisation des comportements est réalisée en clonant des objets existants qui servent de prototypes.

5) L'objet utilisé comme modèle à partir du nouvel objet obtient les propriétés initiales

4
Sunil Garg