Il y a une centaine de problèmes de terminologie ici, principalement construits autour de quelqu'un (pas vous) essayant de faire sonner son idée comme The Best.
Tous les langages orientés objet doivent pouvoir traiter plusieurs concepts:
- encapsulation de données ainsi que les opérations associées sur les données, connues sous le nom de membres de données et de fonctions membres, ou de données et méthodes, entre autres.
- l'héritage, la possibilité de dire que ces objets sont comme cet autre ensemble d'objets SAUF pour ces changements
- polymorphisme ("plusieurs formes") dans lequel un objet décide lui-même des méthodes à exécuter, afin que vous puissiez dépendre du langage pour acheminer correctement vos requêtes.
Maintenant, en ce qui concerne la comparaison:
La première chose est toute la question "classe" vs "prototype". L'idée a commencé à l'origine dans Simula, où avec une méthode basée sur les classes, chaque classe représentait un ensemble d'objets qui partageaient le même espace d'état (lire "valeurs possibles") et les mêmes opérations, formant ainsi une classe d'équivalence. Si vous regardez en arrière Smalltalk, puisque vous pouvez ouvrir une classe et ajouter des méthodes, c'est en fait la même chose que ce que vous pouvez faire en Javascript.
Plus tard, les langages OO voulaient pouvoir utiliser la vérification de type statique, nous avons donc eu la notion d'un ensemble de classes fixe au moment de la compilation. Dans la version open-class, vous aviez plus de flexibilité; dans la version la plus récente, vous aviez la possibilité de vérifier certains types d'exactitude sur le compilateur qui auraient autrement nécessité des tests.
Dans un langage "basé sur les classes", cette copie a lieu au moment de la compilation. Dans un langage prototype, les opérations sont stockées dans la structure de données prototype, qui est copiée et modifiée au moment de l'exécution. De manière abstraite, cependant, une classe est toujours la classe d'équivalence de tous les objets qui partagent le même espace d'état et les mêmes méthodes. Lorsque vous ajoutez une méthode au prototype, vous créez effectivement un élément d'une nouvelle classe d'équivalence.
Maintenant, pourquoi faire ça? principalement parce qu'il permet un mécanisme simple, logique et élégant au moment de l'exécution. maintenant, pour créer un nouvel objet, ou pour créer une nouvelle classe, il vous suffit d'effectuer une copie complète, en copiant toutes les données et la structure de données du prototype. Vous obtenez alors l'héritage et le polymorphisme plus ou moins gratuitement: la recherche de méthode consiste toujours à demander à un dictionnaire une implémentation de méthode par nom.
La raison qui a abouti au script Javascript / ECMA est essentiellement que lorsque nous avons commencé avec cela il y a 10 ans, nous avions affaire à des ordinateurs beaucoup moins puissants et à des navigateurs beaucoup moins sophistiqués. Le choix de la méthode basée sur le prototype signifiait que l'interpréteur pouvait être très simple tout en préservant les propriétés souhaitables de l'orientation des objets.