JavaScript est-il orienté objet?

on s'est demandé si JavaScript était ou non un langage orienté objet. Même une affirmation, "ce n'est pas parce qu'une langue a des objets qu'elle est OO."

JavaScript Est un langage orienté objet?

55
demandé sur Gabi Purcaru 2008-09-20 11:03:04

27 réponses

OMI (et ce n'est qu'une opinion) le caractéristique clé d'un langage orienté objet serait qu'il soutiendrait polymorphisme . Presque tous les langages dynamiques font ça.

la caractéristique suivante serait encapsulation et c'est assez facile à faire en Javascript aussi.

cependant dans l'esprit de beaucoup c'est héritage (spécifiquement héritage de mise en œuvre) qui ferait pencher la balance quant à savoir si un langage peut être appelé orienté objet.

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

donc si votre critère pour l'orientation de l'objet est le plan à trois classique du polymorphisme, encapsulation et l'héritage puis Javascript ne passe pas.

Edit : la question supplémentaire est soulevée " comment le prototype de l'encapsulation de sacrifice d'héritage?"Considérons 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 prototypique de la même classe: -

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

C'est cassé. Comme la fonction assignée à getValue n'est plus en scope avec _value, elle ne peut y accéder. Nous aurions besoin de promouvoir _value à un attribut de this mais cela le rendrait accessible en dehors du contrôle du code écrit pour la classe, donc l'encapsulation est cassée.

malgré cela mon vote reste que Javascript est orienté objet. Pourquoi? Car avec un OOD je peux l'implémenter en Javascript.

53
répondu AnthonyWJones 2012-06-17 12:44:43

la réponse courte est oui. Pour plus d'informations:

À Partir De Wikipedia :

JavaScript est fortement basé sur les objets. Les objets sont des tableaux associatifs, augmentée à l'aide de prototypes (voir ci-dessous). Les noms de propriétés des objets sont associatifs touches du tableau: obj.x = 10 et obj ["x"] = 10 sont équivalents, la notation de point simple sucre syntaxique. Propriétés et leurs valeurs peuvent être ajouté, modifié ou supprimé à la au moment de l'exécution. Les propriétés d'un objet peut également être énumérés par l'intermédiaire d'un de... boucle.

voir Aussi cette série d'articles à propos de la programmation orientée objet avec Javascript.

36
répondu Eli Bendersky 2008-09-20 07:08:28

Javascript est un langage multi-paradigme qui prend en charge les styles de programmation procédurale, orientée objet (basée sur un prototype) et fonctionnelle.

voici un article discutant comment faire OO en Javascript.

24
répondu jop 2008-09-20 07:19:08
Les langages

n'ont pas besoin de se comporter exactement comme Java pour être orientés objet. Tout dans Javascript est un objet; comparez à C++ ou à Java antérieur, qui sont largement considérés comme orientés objet dans une certaine mesure, mais toujours basés sur des primitives. Le polymorphisme n'est pas un problème dans Javascript, car il ne se soucie pas beaucoup des types du tout. La seule caractéristique OO de base qui n'est pas directement supportée par la syntaxe est l'hérédité, mais qui peut facilement être implémentée cependant le programmeur veut utiliser des prototypes: ici en est un exemple.

19
répondu Eevee 2008-09-20 08:11:58

Oui et non.

JavaScript est, comme Douglas Crockford met, " du monde les plus mal compris le langage de programmation ."Il a quelques d'excellents articles sur JavaScript que je recommanderais fortement la lecture de ce exactement JavaScript est. Il a plus en commun avec LISP que C++.

10
répondu David Mohundro 2008-09-22 17:55:58

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

10
répondu munificent 2009-04-08 18:43:34

JavaScript est un langage de programmation basé sur un prototype (probablement le langage de script basé sur un prototype est une définition plus correcte). Elle utilise le clonage et non l'héritage. Un langage de programmation basé sur un prototype est un style de programmation orientée objet sans classes. Tandis que les langages de programmation orientés objet encouragent le développement à se concentrer sur la taxinomie et les relations, les langages de programmation basés sur des prototypes encouragent à se concentrer sur le comportement d'abord et ensuite classifier.

le terme" orienté objet "a été inventé par Alan Kay en 1967, qui l'explique en 2003 pour signifier

messagerie uniquement, rétention locale et protection et dissimulation de processus d'état, et extrême retard-reliure de toutes choses. (source)

dans la programmation orientée objet, chaque objet est capable de recevoir des messages, de traiter des données, et l'envoi de messages à d'autres objets.

Pour un langage orienté objet en peuvent inclure des éléments comme l'encapsulation, modularité, le polymorphisme et l'héritage, mais il n'est pas une exigence. Les langages de programmation orientés objet qui utilisent des classes sont souvent appelés langages de programmation orientés objet, mais il n'est en aucun cas obligatoire d'utiliser des classes 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 est orienté objet.

8
répondu Ed Cottrell 2017-11-29 17:00:55

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

@eliben: Wikipedia dit objet - basé sur . Ce n'est pas la même chose que orientée objet. En fait, leur article sur établit une distinction entre les langages orientés objet et ceux basés sur des prototypes., appelant explicitement JavaScript et non orienté objet.

6
répondu Sören Kuklau 2008-09-20 07:55:14

JavaScript est un très bon langage pour écrire des applications web orientées objet. Il peut soutenir OOP parce que soutient l'héritage par prototypage aussi des propriétés et des méthodes. Vous pouvez avoir du polymorphisme, de l'encapsulation et de nombreux paradigmes de sous-classification.

3
répondu CMS 2008-09-20 07:11:24

il s'agit bien sûr d'une question subjective et académique. Certaines personnes se demandent si une langue OO doit mettre en œuvre des classes et l'héritage, d'autres écrivent des programmes qui changent votre vie. ;- )

(mais vraiment, pourquoi un langage OO devrait-il implémenter des classes? Je pensais que objets étaient les composants clés. Comment vous créez et puis les utiliser est une autre question.)

2
répondu Christian Davén 2008-09-20 07:48:09

il est un bon thread. Voici quelques ressources que j'aime. La plupart des gens commencent avec prototype, jquery, ou l'un des 6 meilleurs libs(mootools, ExtJS, YUI), qui ont différents modèles d'objet. Prototype tente de répliquer O-O classique comme la plupart des gens y pensent

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

Voici une image de prototypes et de fonctions que je se référer à un lot

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

2
répondu Gene T 2008-09-30 18:47:28

je réponds à cette question sous un autre angle.

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

quand les gens affirment que JavaScript est un langage de programmation OO parce qu'ils peuvent utiliser OOD avec cela, alors je me demande: pourquoi ce n'est pas un langage de programmation OO? Je répète, vous pouvez utiliser OOD avec C et si vous avez dit 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, parce que ce sujet est plus ancien que L'Internet:)

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

un langage de programmation OO doit avoir des objets, méthode, propriété, classes, encapsulation, agrégation, hérédité et 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écrire 10 façons de mettre en œuvre"héritage". Combien y a-t-il de manières à Java? Un, et en C++? Un, et dans Delphi (objet Pascal)? Un, et dans L'objectif-C? Un.

Pourquoi est-ce différent? Parce que Java, C++, Delphi et Objective-C sont conçus avec la programmation orientée objet à l'esprit, mais pas le JavaScript.

quand j'étais étudiant (en 1993), à l'université, il y avait un travail à domicile typique: mettre en œuvre un programme Conçu en utilisant un OOD (design orienté objet) avec un langage non-OO. À cette époque, le langage choisi était C (et non c++). L'objectif de ces pratiques était de faire clairement la différence entre L'OOD et l'OOP, et de faire la différence entre les langues OOP et non OOP.

quoi qu'il en soit, il est la preuve que pas tous les gens ont une certaine opinion sur ce sujet:)

quoi qu'il en soit, à mon avis, JavaScript est un langage puissant et le futur dans la couche côté client!

2
répondu angelcervera 2011-04-02 01:26:30

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

1
répondu Aaron Powell 2011-04-02 01:15:52

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

1
répondu rodrigo-silveira 2012-01-29 17:43:04

le Microsoft Ajax Client Library rend simple à mettre en œuvre OO en javascript. Il prend en charge l'inharitence et la mise en œuvre de l'interface.

0
répondu urini 2008-09-20 07:15:11

je pense que beaucoup de gens répondent à cette question" non " parce que JavaScript N'implémente pas les classes, dans le sens oo traditionnel. Malheureusement (IMHO), cela vient en ECMAScript 4. En attendant, viva la prototype! :- )

0
répondu Andrew Hedges 2008-09-20 07:31:33

je pense que lorsque vous pouvez suivre les mêmes modèles de conception ou similaires qu'un vrai langage OO comme Java/C#, vous pouvez à peu près l'appeler un langage OO. Certains aspects sont évidemment différents, mais vous pouvez toujours utiliser très bien établi oo design patternsn.

0
répondu mattlant 2008-09-20 07:58:35

JavaScript est Basé sur l'Objet, pas Orienté Objet. La différence est que les langages basés sur les objets ne prennent pas en charge l'héritage approprié, alors que les langages orientés objet le font.

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

0
répondu dsm 2008-09-20 08:41:56

tout dans javascript est un objet-les classes sont des objets, les fonctions sont des objets, les nombres sont des Objets, Objets Objets Objets Objets Objets. Il n'est pas aussi strict sur la dactylographie que d'autres langues, mais il est certainement possible d'écrire OOP JS.

0
répondu matt lohkamp 2008-09-20 09:54:51

Javascript n'est pas un langage orienté objet comme typiquement considéré, principalement en raison du manque de véritable héritage, canard typing permet une forme semi-vraie d'héritage/polymorphisme avec l'objet.prototype permettant le partage de fonctions complexes. En son cœur, mais l'absence de l'héritage conduit à un faible polymorphisme depuis le DUCK-typing va insister un objet avec les mêmes noms d'attributs sont une instance d'un Objet dont ils n'étaient pas destinés à être utilisés comme. Ainsi l'ajout d'attributs à l'Objet aléatoire transforme la base de leur type d'une manière de parler.

0
répondu bmeck 2008-09-21 23:31:53

techniquement, C'est un langage prototype, mais c'est facile à utiliser.

0
répondu Rik 2008-09-22 17:48:52

Il est orienté objet, mais pas basé sur les classes, il est basé sur les prototypes.

0
répondu Vasil 2008-09-22 17:50:45

Oui, c'est ça. Cependant, il ne supporte pas toutes les fonctionnalités que l'on peut attendre dans un langage de programmation orienté objet, sans héritage ni polymorphisme. Cela ne signifie pas, cependant, que vous ne pouvez pas simuler ces capacités à travers le système de prototypage qui est disponible pour le langage.

0
répondu MikeJ 2011-04-02 01:17:08

les objets en JavaScript héritent directement des objets. Ce qui peut être plus orienté objet?

0
répondu Pavel Feldman 2011-04-02 01:18:22

pour moi personnellement, la principale attraction de la programmation de L'OOP est la capacité d'avoir des classes autonomes avec des fonctionnements intérieurs (privés) non exposés.

ce qui me trouble le plus dans Javascript, C'est que vous ne pouvez même pas utiliser les noms de fonction, parce que vous courez le risque d'avoir ce même nom de fonction ailleurs dans n'importe laquelle des bibliothèques externes que vous utilisez.

même si certaines personnes très intelligentes ont trouvé des solutions de rechange pour cela, n'est pas il est étrange que Javascript dans sa forme la plus pure exige que vous créiez du code qui est hautement illisible?

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

0
répondu Kokodoko 2012-05-11 14:42:25

est-ce que JavaScript est orienté objet?

Réponse: Oui

Il a des objets qui peuvent contenir des données et des méthodes qui agissent sur ces données. Les objets peuvent contenir d'autres objets.

  • il n'y a pas de classes, mais il y a des constructeurs qui font ce que font les classes, y compris agir comme des conteneurs pour les variables de classe et les méthodes.
  • Il n'a pas l'héritage est orienté vers la classe, mais il a un héritage orienté vers le prototype.

les deux principales façons de construire des systèmes d'objets sont par héritage (is-a) et par agrégation (has-a). Le JavaScript n'fois, mais sa nature dynamique lui permet d'exceller à l'agrégation.

certains soutiennent que JavaScript n'est pas vraiment orienté objet parce qu'il ne fournit pas de cacher des informations. C'est-à-dire que les objets ne peuvent pas avoir de variables et 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 comprennent cela parce que JavaScript est le langage de programmation le plus mal compris au monde.

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

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

0
répondu Vinayak Bevinakatti 2012-05-14 11:51:30

je dirais qu'il a des capacités à sembler OO. Surtout si vous profitez de sa capacité à créer des méthodes sur un objet existant (méthodes anonymes dans certaines langues). Les bibliothèques de script Client comme jquery (jquery.com) ou prototype (prototypejs.org) sont de bons exemples de bibliothèques qui en tirent profit, faisant en sorte que javascript se comporte plutôt comme un OO.

-1
répondu Per Hornshøj-Schierbeck 2008-09-20 07:41:50