Est JavaScript orienté objet?
Il y a eu quelques questions quant à savoir si ou de ne pas le JavaScript est un langage orienté-objet. Même une déclaration, "juste parce qu'un langage a objets n'est pas ça OO."
JavaScript est un langage orienté objet?
- je voudrais ajouter du "subjectif" de la balise
- Je ne pense pas que c'est subjectif. Il est ou il n'est pas ou il y a une raison particulière pour qu'il soit dans le milieu. Pourquoi pensez-vous que c'est subjectif?
- Cette question a 11 réponses dans 34 secondes d'affichage, - wow.
- Parce que la définition de "orienté objet" ne permet pas de spécifier une série de critères pour déterminer une réponse exacte
- Je suis d'accord avec Sklivvz c'est subjectif car la il n'y a pas d'autorité en précisant exactement quelles sont les caractéristiques d'une langue doit être ont l'adjectif 'orienté objet'.
- est-il un moyen d'affiner la question?
- Fait intéressant, la plupart des gens qui ont répondu 'non, il n'est pas" faire prétendant JS manque de réutilisation de code, par héritage, ce qui est probablement l'un des pires aspects de la traditionnelle OO langues, et l'un de nous peut et doit faire sans.
- Plus-donc un avis plutôt que d'une réponse, mais voici mes deux cents. Assurez-JS peut être OO, mais il manque un couple de choses que je pense sont très caractéristiques des langages à objets. 1. Des Classes. Ils vous aident à rester organisé en le forçant à encapsuler votre programme. 2. Déclarations prévues. Sûr que cela peut sembler ennuyeux, mais encore une fois, il vous oblige à rester organisé.
- Oui! Un peu comme la façon dont les planches à roulettes et les monocycles peuvent être appelés "voyage orienté vers les véhicules".
Vous devez vous connecter pour publier un commentaire.
De l'OMI (et ce n'est qu'une opinion) la des principales caractéristiques d'un langage orienté objet serait qu'il aurait l'appui de le polymorphisme. À peu près tous les langages dynamiques de le faire.
La caractéristique suivante serait l'encapsulation et qui est assez facile à faire en Javascript aussi.
Cependant dans l'esprit de beaucoup, c'est héritage (plus précisément de la mise en œuvre de l'héritage) qui ferait pencher la balance pour savoir si une langue peut être appelé orientée objet.
Le Javascript n'est assez facile de moyens pour hériter de la mise en œuvre par le prototypage, mais c'est au détriment de l'encapsulation.
Donc, si vos critères de l'orientation de l'objet est le classique trio de polymorphisme, l'encapsulation et l'héritage Javascript ne passe pas.
Modifier: La complémentaire question est "comment prototypes héritage sacrifice d'encapsulation?" Prenons cet exemple de non-approche prototypes:-
La _value attribut est encapsulé, il ne peut pas être modifié directement par le code externe. On peut ajouter un mutateur à la classe de le modifier d'une manière entièrement contrôlé par le code qui est partie de la classe. Maintenant, considérons une approche prototypes à la même classe:-
Bien c'est cassé. Depuis la fonction attribuée à getValue est plus étendue avec _value il ne peut pas y accéder. Nous aurions besoin de promouvoir _value à un attribut de
this
mais qui le rendrait accessible en dehors du contrôle de code écrit pour la classe, d'où l'encapsulation est cassé.Malgré cela mon vote reste que le Javascript est orientée objet. Pourquoi? Parce qu'étant donné un OOD je peux la mettre en œuvre en Javascript.
GetValue
à l'encontre d'un exemple deMyClass
de toute façon, dans mon code lagetValue
n'est pas équivalente à une méthode statique, un peu plus près l'équivalent serait une méthode d'extension en C#.function MyClass() { var _value = 1; MyClass.prototype.getValue = function() { return _value; } }
incrementValue
méthode, puis jouer avec plusieurs instances de MyClass et vous verrez ce que je veux dire.incrementValue
à laprototype
dans le corps du constructeur de la même façongetValue
a été ajoutée se comporte comme prévu... chaque instance commence avec_value == 1
etincrementValue
incréments_value
pour cette instance seulement, comme unprivate
propriété se comporter dans une classe. Quel est le comportement que vous attendez? Ce qui me manque? jsfiddle.net/7ag7ZMyClass
permettra de partager exactement les mêmes fonctions que la dernière instance d'être créé. Si vous créez deux instances alors appel incrément sur deux, puis getValue appel sur les deux, vous obtiendrez 3 renvoyée par les deux. Les fonctions qui ont été créés dans la première instance sont supprimées et remplacées lorsque vous créez le deuxième instance. La portée d'exécution de la première n'est plus à utiliser, même par la première instance parce que les fonctions qu'il expose sont maintenant réellement ceux créés dans la seconde.La réponse courte est Oui. Pour plus d'informations:
De Wikipédia:
Aussi, voir cette série d'articles sur la programmation orientée objet avec Javascript.
Javascript est un multi-paradigme de la langue qui prend en charge procédural, orienté objet (prototype) et de la programmation fonctionnelle styles.
Voici un l'article discuter de la façon de faire OO en Javascript.
Langues n'ont pas besoin de se comporter exactement comme Java orienté objet. Tout en Javascript est un objet, à comparer à C++ ou une version antérieure de Java, qui sont largement considérées comme orientées objet à un certain degré, mais toujours basée sur les primitives. Le polymorphisme est un non-problème en Javascript, car il n'a pas beaucoup de soin sur les types à tous. La seule base OO fonctionnalité qui n'est pas directement pris en charge par la syntaxe de l'héritage, mais qui peut facilement être mis en œuvre cependant, le programmeur veut à l'aide de prototypes: ici en est un exemple.
Oui et non.
JavaScript est, comme Douglas Crockford met, "du monde la plus mal comprise de 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 C++.
JavaScript est orienté objet, mais n'est pas un la classe de base des langage orienté objet comme Java, C++, C#, etc. La classe de base de la programmation orientée objet les langues sont un sous-ensemble de la grande famille de la programmation orientée objet les langues qui incluent également le prototype de langages comme le JavaScript et l'Auto.
JavaScript est un prototype basé sur un langage de programmation (probablement prototype à base de langage de script est plus la bonne définition). Il emploie le clonage et de ne pas l'héritage. Un prototype à base de langage de programmation est un style de programmation orienté objet sans classes. Alors que les langages de programmation orientée objet encourage le développement se concentre sur la taxonomie et les relations, prototype de langages de programmation basés sur les encourage à se concentrer sur le comportement d'abord, puis plus tard, classer.
Le terme “orienté objet” a été inventé par Alan Kay en 1967, qui l'explique en 2003 à dire
En programmation orientée objet, chaque objet est capable de recevoir des messages, le traitement 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. Langages de programmation orientée objet qui rendent l'utilisation de classes sont souvent désignés comme des classée à base de langages de programmation, mais il est en aucun cas une nécessité pour rendre l'utilisation de classes orientées objet.
JavaScript utilise des prototypes pour définir les propriétés de l'objet, y compris les méthodes et l'héritage.
Conclusion: JavaScript EST orienté objet.
Contrairement à la plupart des langages orientés objet, JavaScript (avant ECMA 262 Edition 4, de toute façon) n'a pas de notion de classes, mais des prototypes. En tant que tel, il est en effet assez subjective, l'opportunité d'appeler orientée objet ou pas.
@eliben: Wikipédia dit objeten fonction. Ce n'est pas le même que l'orienté objet. En fait, leur article sur l'objet fait la distinction entre les langages orientés objet et le prototype de la base, appelant explicitement JavaScript pas orientée objet.
JavaScript est un très bon langage pour écrire orienté objet, web apps. Il peut prendre en charge la programmation orientée objet en raison prend en charge l'héritage par prototypage également des propriétés et des méthodes. Vous pouvez avoir le polymorphisme, l'encapsulation et de nombreux sous-classing paradigmes.
C'est bien sûr subjectif et d'une question purement théorique. Certaines personnes affirment qu'un langage OO a à mettre en œuvre les classes et l'héritage, d'autres d'écrire des programmes qui changent votre vie. 😉
(Mais vraiment, pourquoi un langage OO mettre en place de classes? Je pense objets ont été les principaux composants. Comment vous créez et puis les utiliser en est une autre affaire.)
il est un bon thread. Voici quelques ressources que j'aime. La plupart des gens commencent avec prototype, jquery, ou l'un des top 6 des libs(mootools, ExtJS, YUI), qui ont des modèles d'objet. Prototype essaie de répliquer classique O-O comme la plupart des gens pensent qu'il
http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/
Voici une photo des prototypes et des fonctions que je reportez-vous à beaucoup
http://www.mollypages.org/misc/js.mp?
Je suis de répondre à cette question a rebondi à partir d'un autre angle.
C'est un éternel sujet, et nous avons pu ouvrir une flamme de guerre dans beaucoup de forums.
Quand les gens affirment que JavaScript est un OO langage de programmation, car ils peuvent utiliser des CRUES avec cela, alors je pose la question: Pourquoi n'est pas C un OO langage de programmation? Répétez, vous pouvez utiliser des INONDATIONS avec des C et si on vous dit que C est un OO langage de programmation), tout le monde dit que vous êtes fou.
L'on pourrait mettre ici beaucoup de références sur ce thème dans de très vieux livres et des forums, parce que ce sujet est vieux de plus de l'Internet 🙂
JavaScript n'a pas changé depuis de nombreuses années, mais les nouveaux programmeurs veulent montrer JavaScript est un OO langage de programmation. Pourquoi? JavaScript est un langage puissant, mais n'est pas un OO langage de programmation.
Un OO langage de programmation doit avoir des objets, une méthode, une propriété, les classes, encapsulation, l'agrégation, l'héritage et le polymorphisme. Vous pourriez mettre en œuvre tous ces points, mais le JavaScript n'est pas eux.
Un très illustrer exemple: Dans le chapitre 6 de "Orienté Objet JavaScript" décrire 10 manières de mettre en œuvre "l'héritage". De combien de manières il existe en Java? L'un, et en C++? L'un, et en Delphi (Pascal Objet)? L'un, et dans Objective-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 une maison typique de travail: mettre en Œuvre un programme conçu à l'aide d'une INONDATION (Object-oriented design) avec un non-langage OO. Dans ces moments, la langue sélectionnée est C (pas C++). L'objectif de ces pratiques est de faire clairement la différence entre les CRUES et de la programmation orientée objet, et pourrait permettre de différencier la programmation orientée objet et non-OOP langues.
De toute façon, c'est la preuve que pas tous les gens ont une certaine opinion sur ce sujet 🙂
De toute façon, à mon avis, le JavaScript est un langage puissant et le futur dans le côté client de la couche de!
Hanselminutes l'épisode 146 regarde OO Ajax. C'était un bon spectacle et certainement un bon spectacle pour les aider à se former une opinion.
Misko Hevery fait une excellente introduction à Google de Parler de Technologie où il parle des objets en Javascript. J'ai trouvé ceci pour être un bon point de départ pour les personnes qui remet en question l'utilisation des objets en Javascript, ou qui souhaitent se lancer avec eux:
La Microsoft Ajax Client Bibliothèque le rend simple à mettre en œuvre OO en javascript. Il prend en charge inharitence, et l'implémentation de l'interface.
Je pense que beaucoup de gens répondre à cette question "non" parce que JavaScript ne permet pas de mettre en œuvre des classes, dans la traditionnelle OO sens. Malheureusement (à mon humble avis), c'est-à venir dans ECMAScript 4. Jusqu'alors, viva la prototype! 🙂
Je pense que lorsque vous pouvez suivre les mêmes ou similaires, les modèles de conception comme un véritable langage OO comme Java/C#, vous pouvez très bien l'appeler un langage OO. Certains aspects sont évidemment différentes, mais vous pouvez toujours utiliser très bien établi OO design pattersn.
JavaScript est Basé sur l'Objet, pas Orienté Objet. La différence est que l'Objet de langues ne prennent pas en charge adéquate de l'héritage, alors que l'Objet de celles qui visent à faire.
Il existe un moyen de parvenir à un "normal" de l'héritage en JavaScript (Référence ici), mais le modèle de base est basée sur le prototypage.
Tout en javascript est un objet - classes sont des objets, les fonctions sont des objets, les nombres sont des objets, des objets des objets des objets. Ce n'est pas aussi strict sur les taper comme d'autres langues, mais il est certainement possible d'écrire de la programmation orientée objet JS.
Javascript n'est pas un langage orienté objet comme généralement considéré, principalement en raison du manque de véritable héritage, DUCK-typing permet une semi-vraie forme de droits de succession/polymorphisme avec l'Objet.prototype permettant de complexe de la fonction de partage. 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 d'objet aléatoire transforme leur type de base d'une manière de parler.
Techniquement, c'est un prototype de la langue, mais il est facile à OO dans il.
Il est orienté objet, mais pas basé sur les classes, il est basé sur les prototypes.
Oui, il est. Cependant, il ne supporte pas toutes les fonctionnalités que l'on peut attendre d'un langage de programmation orienté objet manquant d'héritage et de polymorphisme. Cela ne veut pas dire, cependant, que vous ne pouvez pas simuler ces capacités à travers le système de prototypage qui est disponnible à la langue.
Objets en JavaScript hérite directement à partir d'objets. Ce qui peut être plus orienté objet?
Pour moi personnellement, l'attraction principale de la programmation orientée objet la programmation est la capacité d'avoir des classes autonomes avec les non exposés (privé) fonctionnement interne.
Ce qui me confond d'aucune fin en Javascript, c'est que vous ne pouvez même pas utiliser les noms de fonction, parce que
vous courez le risque d'avoir le même nom de fonction quelque part d'autre dans l'une des bibliothèques externes que vous utilisez.
Même si certaines personnes très intelligentes ont trouvé des solutions de contournement pour ce, n'est-il pas étrange que le Javascript dans sa forme la plus pure vous oblige à créer un code qui est très illisible?
La beauté de la programmation orientée objet, c'est que vous pouvez passer votre temps à penser au sujet de votre application de la logique, sans avoir à se soucier de la syntaxe.
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.
Les deux principales façons de construire des systèmes d'objets sont par héritage (est-un) et par l'agrégation (a-a). Le JavaScript n'fois, mais sa nature dynamique lui permet d'exceller à l'agrégation.
Certains prétendent que le JavaScript n'est pas vraiment orienté objet, car il ne fournit pas de se cacher de l'information. Qui est, les objets ne peuvent pas avoir privé les variables et les méthodes privées: Tous les membres sont publics.
Mais il s'avère que JavaScript les objets peuvent avoir des variables privées et méthodes privées. (Cliquez ici pour savoir comment le faire.) Bien sûr, peu de gens comprennent ce parce que JavaScript est le monde le plus mal compris de langage de programmation.
Certains prétendent que le 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 la classique héritage, mais d'autres réutilisation du code de modèles ainsi.
Sources : http://javascript.crockford.com/javascript.html
Je dirais qu'il a des capacités, afin de paraître OO. Surtout si vous profitez de sa capacité à créer des méthodes sur un objet existant (méthodes anonymes dans certaines langues). Script Client bibliothèques comme jquery (jquery.com) ou d'un prototype (prototypejs.org) en sont de bons exemples de bibliothèques, profitant de ce, de prise de javascript comportent à peu OO-comme.