web-dev-qa-db-fra.com

JavaScript est-il orienté objet?

Quelques questions ont été posées pour savoir si JavaScript est un langage orienté objet. Même une déclaration, "juste parce qu'un langage a des objets ne le rend pas OO".

JavaScript est-il un langage orienté objet?

55
ScottKoon

OMI (et ce n’est qu’une opinion) La caractéristique d’un langage orienté objet serait qu’il prendrait en charge polymorphisme . Pratiquement tous les langages dynamiques le font.

La prochaine caractéristique serait encapsulation et c'est assez facile à faire en Javascript également.

Cependant, dans l'esprit de beaucoup, c'est héritage (= spécifiquement l'héritage d'implémentation) qui indiquerait si un langage peut être qualifié de orienté objet.

Javascript fournit un moyen assez facile d'hériter de la mise en œuvre via le prototypage, mais cela se fait au détriment de l'encapsulation.

Donc, si vos critères pour l'orientation d'objet sont le trio classique du polymorphisme, de l'encapsulation et de l'héritage, alors Javascript ne passe pas.

Edit : La question complémentaire est posée "Comment l'héritage prototype réduit-il l'encapsulation?" Considérez cet exemple d’approche non prototypique: -

function MyClass() {
    var _value = 1;
    this.getValue = function() { return _value; }
}

L'attribut _value est encapsulé, il ne peut pas être modifié directement par un code externe. Nous pourrions ajouter un mutateur à la classe pour la modifier d’une manière entièrement contrôlée par le code qui fait partie de la classe. Considérons maintenant une approche prototype de la même classe: -

function MyClass() {
  var _value = 1;
}
MyClass.prototype.getValue = function() { return _value; }

Eh bien c'est cassé. Comme la fonction affectée à getValue n'est plus dans la portée de _value, elle ne peut y accéder. Nous aurions besoin de promouvoir _value en tant qu'attribut de this, mais cela le rendrait accessible en dehors du contrôle du code écrit pour la classe. Par conséquent, l'encapsulation est interrompue.

Malgré cela, mon vote reste que Javascript est orienté objet. Pourquoi? Parce que étant donné un OOD je peux le mettre en œuvre en Javascript.

53
AnthonyWJones

La reponse courte est oui. Pour plus d'informations:

De Wikipedia :

JavaScript est fortement basé sur les objets. Les objets sont des tableaux associatifs, augmentés de prototypes (voir ci-dessous). Les noms de propriété d'objet sont des clés de tableau associatif: obj.x = 10 et obj ["x"] = 10 sont équivalents, la notation par points étant simplement du sucre syntaxique. Les propriétés et leurs valeurs peuvent être ajoutées, modifiées ou supprimées au moment de l'exécution. Les propriétés d'un objet peuvent également être énumérées via une boucle for ... in.

Voir aussi cette série d'articles à propos de OOP avec Javascript.

36
Eli Bendersky

Javascript est un langage multi-paradigme qui prend en charge les styles de programmation procéduraux, orientés objet (basés sur des prototypes) et fonctionnels.

Voici un article expliquant comment faire OO en Javascript.

24
jop

Les langues n'ont pas besoin de se comporter exactement comme Java pour être orientées objet. Tout en Javascript est un objet; comparez à C++ ou à Java antérieur, qui sont largement considérés orientés objet dans une certaine mesure, mais toujours basés sur des primitives. Le polymorphisme n'est pas un problème en Javascript, car il ne s'intéresse pas du tout aux types. La seule fonctionnalité OO principale non prise en charge directement par la syntaxe est l'héritage, mais elle peut être facilement implémentée, mais le programmeur souhaite utiliser des prototypes: here en est un exemple.

19
Eevee

JavaScript est orienté objet, mais n'est pas un langage basé sur la classe comme Java, C++, C #, etc. basé sur la classe OOP langues sont un sous-ensemble de la grande famille des OOP langages qui incluent également des langages basés sur des prototypes tels que JavaScript et Self.

10
munificent

Oui et non.

Comme le dit Douglas Crockford, JavaScript est " le langage de programmation le plus mal compris au monde ." Il a d'excellents articles sur JavaScript qu'il est vivement recommandé de lire sur ce qu'est JavaScript. Il a plus en commun avec LISP que C++.

10
David Mohundro

JavaScript est un langage de programmation basé sur un prototype (le langage de script basé sur un prototype a probablement une définition plus correcte). Il utilise le clonage et non l'héritage. Un langage de programmation basé sur un prototype est un style de programmation orienté objet sans classes. Alors que les langages de programmation orientés objet encouragent le développement à se focaliser sur la taxonomie et les relations, les langages de programmation basés sur des prototypes incitent à se concentrer d'abord sur le comportement, puis sur la classification.

Le terme "orienté objet" a été inventé par Alan Kay en 1967, qui l’expliquait en 2003 comme signifiant

uniquement la messagerie, la rétention et la protection locales et le masquage de processus d'état, ainsi que la liaison tardive extrême de toutes choses.  (source)

En programmation orientée objet, chaque objet est capable de recevoir des messages, de traiter des données et d'envoyer des messages à d'autres objets.

Pour qu'un langage soit orienté objet, il peut inclure des fonctionnalités telles que l'encapsulation, la modularité, le polymorphisme et l'héritage, mais ce n'est pas une obligation. Les langages de programmation orientés objet qui utilisent des classes sont souvent qualifiés de langages de programmation basés sur des classes, mais il n’est en aucun cas indispensable d’utiliser les classes pour qu’elles soient orientées objet.

JavaScript utilise des prototypes pour définir les propriétés des objets, y compris les méthodes et l'héritage.

Conclusion: JavaScript IS orienté objet.

8
Vefýsing

Contrairement à la plupart des langages orientés objet, JavaScript (avant ECMA 262 Edition 4, en tout cas) n'a pas de concept de classes, mais de prototypes. En tant que tel, il est en effet quelque peu subjectif de l'appeler ou non orienté objet.

@eliben: Wikipedia dit objet - basé sur . Ce n'est pas pareil que orienté objet. En fait, leur article sur les objets distingue les langages orientés objets des prototypes, en appelant explicitement JavaScript et non orienté objet.

6
Sören Kuklau

JavaScript est un très bon langage pour écrire des applications Web orientées objet. Il peut prendre en charge OOP car il prend en charge l'héritage via le prototypage, ainsi que des propriétés et des méthodes. Vous pouvez avoir un polymorphisme, une encapsulation et de nombreux paradigmes de sous-classification.

3
CMS

Ceci est bien sûr subjectif et une question académique. Certaines personnes se demandent si un langage OO doit implémenter des classes et un héritage, d'autres écrivent des programmes qui changent votre vie. ;-)

(Mais en réalité, pourquoi un langage OO devrait-il implémenter des classes? Je pense que objets étaient les composants clés. Comment créer et ensuite les utiliser est une autre affaire .)

2
Christian Davén

est un bon fil. Voici quelques ressources que j'aime. La plupart des gens commencent avec un prototype, jquery ou l'une des 6 premières bibliothèques (mootools, ExtJS, YUI), qui ont différents modèles d'objet. Le prototype essaye de reproduire le O classique comme le pense la plupart des gens

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

Voici une photo des prototypes et des fonctions auxquelles je me réfère souvent

http://www.mollypages.org/misc/js.mp ?

2
Gene T

Je réponds cette question a rebondi sous un autre angle.

C'est un sujet éternel, et nous pourrions ouvrir une guerre de flammes dans de nombreux forums.

Lorsque les gens affirment que JavaScript est un langage de programmation OO parce qu'ils peuvent utiliser OOD avec cela, je leur demande alors: pourquoi le langage de programmation C n'est-il pas OO? Répétez, vous pouvez utiliser OOD avec C et si vous dites que C est un langage de programmation OO, tout le monde vous dira que vous êtes fou.

Nous pourrions mettre ici beaucoup de références sur ce sujet dans de très vieux livres et forums, car ce sujet est plus ancien qu’Internet :)

JavaScript n'a pas changé depuis de nombreuses années, mais les nouveaux programmeurs veulent montrer que JavaScript est un langage de programmation OO. Pourquoi? JavaScript est un langage puissant, mais n’est pas un langage de programmation OO.

Un langage de programmation OO doit comporter des objets, une méthode, une propriété, des classes, une encapsulation, une agrégation, un héritage et un polymorphisme. Vous pouvez implémenter tous ces points, mais JavaScript ne les a pas.

Un exemple très illustratif: Dans le chapitre 6 de "JavaScript orienté objet", décrivez 10 manières de mettre en oeuvre un "héritage". Combien de manières y a-t-il en Java? Un et en C++? Un et en Delphi (Object Pascal)? Un et en Objective-C? Une.

Pourquoi est-ce différent? Parce que Java, C++, Delphi et Objective-C sont conçus avec pour objectif OOP, mais pas avec JavaScript.

Lorsque j'étais étudiant (en 1993), à l'université, il y avait un travail typique à domicile: mettre en œuvre un programme conçu à l'aide d'un langage orienté objet (OOD) avec un langage non-OO. À cette époque, le langage sélectionné était le C (pas le C++). L'objectif de cette pratique était de clarifier la différence entre OOD et OOP, et pouvait différencier les langues OOP des langues non-OOP.

Quoi qu’il en soit, c’est la preuve que tout le monde n’a pas d’opinion à ce sujet :)

De toute façon, à mon avis, JavaScript est un langage puissant et le futur dans la couche client!

2
angelcervera

Hanselminutes épisode 146 regarde OO Ajax. C'était un bon spectacle et certainement un bon spectacle pour aider à se faire une opinion.

1
Aaron Powell

Misko Hevery a fait une excellente introduction à Google Tech Talk où il parle d’objets en Javascript. J'ai trouvé que c'était un bon point de départ pour les personnes qui remettaient en question l'utilisation d'objets en Javascript ou qui souhaitaient commencer avec eux:

1
rodrigo-silveira

Je pense que beaucoup de gens répondent "non" à cette question parce que JavaScript n'implémente pas les classes, dans le sens traditionnel OO. Malheureusement (IMHO), cela arrive dans ECMAScript 4. Jusque-là, viva le prototype! :-)

0
Andrew Hedges

JavaScript est-il orienté objet?

Réponse: oui

Il contient des objets pouvant contenir des données et des méthodes agissant sur ces données. Les objets peuvent contenir d'autres objets.

  • Il n'a pas de classes, mais il a des constructeurs qui font ce que font les classes, y compris en agissant en tant que conteneurs pour les variables et méthodes de classe.
  • Il ne possède pas d'héritage orienté classe, mais un héritage orienté prototype.

Les deux manières principales de construire des systèmes d'objets sont l'héritage (is-a) et l'agrégation (has-a). JavaScript fait les deux, mais sa nature dynamique lui permet d’agréger.

Certains avancent que JavaScript n’est pas vraiment orienté objet, car il ne cache pas les informations. Autrement dit, les objets ne peuvent pas avoir de variables privées ni de méthodes privées: tous les membres sont publics.

Mais il s'avère que les objets JavaScript peuvent avoir des variables privées et des méthodes privées. (Cliquez ici maintenant pour savoir comment.) Bien sûr, peu de gens le comprennent, car JavaScript est le langage de programmation le plus mal compris du monde.

Certains soutiennent que JavaScript n'est pas vraiment orienté objet, car il ne fournit pas d'héritage. Mais il s'avère que JavaScript prend en charge non seulement l'héritage classique, mais également d'autres modèles de réutilisation de code.

Sources: http://javascript.crockford.com/javascript.html

0

Les objets en JavaScript héritent directement des objets. Que peut être plus orienté objet?

0
Pavel Feldman

Je pense que lorsque vous pouvez suivre les mêmes modèles ou des modèles similaires à ceux d'un langage OO vrai comme Java/C #), vous pouvez très bien appeler cela un langage OO. Certains aspects sont évidemment différents mais vous pouvez toujours utiliser des méthodes bien établies OO design pattersn.

0
mattlant

JavaScript est basé sur les objets et non sur les objets. La différence est que les langages basés sur les objets ne supportent pas l'héritage approprié, contrairement aux langages orientés objet.

Il existe un moyen d'obtenir un héritage "normal" en JavaScript ( Référence ici ), mais le modèle de base repose sur le prototypage.

0
dsm

Techniquement, c'est un langage prototype, mais il est facile de OO dans celui-ci.

0
Rik

Il est orienté objet, mais ne repose pas sur des classes, mais sur des prototypes.

0
Vasil

Javascript n'est pas un langage orienté objet comme on le considère généralement, principalement en raison d'un manque d'héritage véritable, le typage DUCK permet une forme semi-vraie d'héritage/polymorphisme avec le prototype Object.prototype permettant un partage de fonctions complexe. Cependant, le manque d'héritage entraîne un faible polymorphisme car le typage DUCK insiste sur le fait que certains objets portant le même nom d'attribut sont une instance d'un objet pour lequel ils ne sont pas destinés. Ainsi, ajouter des attributs à un objet aléatoire transforme la base de leur type en une manière de parler.

0
bmeck

Oui, ça l'est. Cependant, il ne prend pas en charge toutes les fonctionnalités attendues dans un langage de programmation orienté objet dépourvu d'héritage et de polymorphisme. Cela ne signifie toutefois pas que vous ne pouvez pas simuler ces fonctionnalités avec le système de prototypage disponible dans le langage.

0
MikeJ

= Microsoft Ajax Client Library simplifie la mise en œuvre de OO en javascript. Il prend en charge l'inharitence et l'implémentation d'interface.

0
urini

Pour moi, l’attraction principale de la programmation OOP) est la possibilité d’avoir des classes autonomes avec un fonctionnement interne non exposé (privé).

Ce qui me confond en Javascript, c’est que vous ne pouvez même pas utiliser de noms de fonctions, car vous courez le risque d’avoir le même nom de fonction ailleurs dans les bibliothèques externes que vous utilisez.

Bien que certaines personnes très intelligentes aient trouvé des solutions de contournement à ce problème, n’est-il pas étrange que Javascript, dans sa forme la plus pure, vous oblige à créer un code très illisible?

La beauté de OOP est que vous pouvez passer votre temps à réfléchir à la logique de votre application, sans avoir à vous soucier de la syntaxe.

0
Kokodoko

Tout en javascript est un objet - les classes sont des objets, les fonctions sont des objets, les nombres sont des objets, des objets, des objets, des objets. La dactylographie n’est pas aussi stricte que d’autres langues, mais il est certainement possible d’écrire OOP JS.

0
matt lohkamp