Je préfère utiliser la POO dans des projets à grande échelle comme celui sur lequel je travaille en ce moment. J'ai besoin de créer plusieurs classes en JavaScript mais, si je ne me trompe pas, il y a au moins deux façons de procéder. Quelle serait la syntaxe et pourquoi cela se ferait-il de cette façon?
Je voudrais éviter d'utiliser des bibliothèques tierces - du moins au début.
À la recherche d'autres réponses, j'ai trouvé l'article Programmation orientée objet avec JavaScript, Partie I: Héritage - Doc JavaScript qui traite de la programmation orientée objet en JavaScript. Existe-t-il une meilleure façon de faire l'héritage?
javascript
oop
class
Karim
la source
la source
Réponses:
Voici la façon de le faire sans utiliser de bibliothèques externes:
Maintenant, la vraie réponse est beaucoup plus complexe que cela. Par exemple, il n'y a pas de classes en JavaScript. JavaScript utilise un
prototype
schéma d'héritage basé sur.De plus, il existe de nombreuses bibliothèques JavaScript populaires qui ont leur propre style d'approximation des fonctionnalités de classe en JavaScript. Vous voudrez vérifier au moins Prototype et jQuery .
Décider lequel d'entre eux est le "meilleur" est un excellent moyen de commencer une guerre sainte sur Stack Overflow. Si vous vous lancez dans un projet plus volumineux, il vaut vraiment la peine d'apprendre une bibliothèque populaire et de le faire à sa manière. Je suis un type Prototype, mais Stack Overflow semble pencher vers jQuery.
Dans la mesure où il n'y a qu'une "façon de le faire", sans aucune dépendance vis-à-vis des bibliothèques externes, la façon dont j'ai écrit est à peu près la même.
la source
La meilleure façon de définir une classe en JavaScript est de ne pas définir de classe.
Sérieusement.
Il existe plusieurs variantes de l'orientation objet, dont certaines sont:
Et probablement d'autres que je ne connais pas.
JavaScript implémente OO basé sur un prototype. Dans OO basé sur un prototype, de nouveaux objets sont créés en copiant d'autres objets (au lieu d'être instanciés à partir d'un modèle de classe) et les méthodes vivent directement dans les objets plutôt que dans les classes. L'héritage se fait par délégation: si un objet n'a pas de méthode ou de propriété, il est recherché sur son ou ses prototypes (c'est-à-dire l'objet à partir duquel il a été cloné), puis sur les prototypes du prototype et ainsi de suite.
En d'autres termes: il n'y a pas de classes.
JavaScript a en fait une belle modification de ce modèle: les constructeurs. Non seulement vous pouvez créer des objets en copiant ceux qui existent déjà, mais vous pouvez aussi les construire "à partir de rien", pour ainsi dire. Si vous appelez une fonction avec le
new
mot - clé, cette fonction devient un constructeur et lethis
mot - clé ne pointera pas vers l'objet actuel mais vers un objet "vide" nouvellement créé. Ainsi, vous pouvez configurer un objet comme vous le souhaitez. De cette façon, les constructeurs JavaScript peuvent assumer l'un des rôles des classes dans les OO classiques basés sur les classes: servir de modèle ou de modèle pour de nouveaux objets.Maintenant, JavaScript est un langage très puissant, il est donc assez facile d'implémenter un système OO basé sur des classes dans JavaScript si vous le souhaitez. Cependant, vous ne devriez le faire que si vous en avez vraiment besoin et pas seulement parce que c'est ainsi que Java le fait.
la source
Classes ES2015
Dans la spécification ES2015, vous pouvez utiliser la syntaxe de classe qui est juste du sucre sur le système prototype.
Avantages
Le principal avantage est que les outils d'analyse statique trouvent plus facile de cibler cette syntaxe. Il est également plus facile pour d'autres venant de langues basées sur les classes d'utiliser la langue comme polyglotte.
Avertissements
Méfiez-vous de ses limites actuelles. Pour obtenir des propriétés privées, il faut recourir à l' utilisation de symboles ou de WeakMaps . Dans les versions futures, les classes seront très probablement étendues pour inclure ces fonctionnalités manquantes.
Soutien
Le support du navigateur n'est pas très bon pour le moment (pris en charge par presque tout le monde sauf IE), mais vous pouvez utiliser ces fonctionnalités maintenant avec un transpilateur comme Babel .
Ressources
la source
Je préfère utiliser celui de Daniel X. Moore
{SUPER: SYSTEM}
. Il s'agit d'une discipline qui offre des avantages tels que les vraies variables d'instance, l'héritage basé sur les traits, les hiérarchies de classes et les options de configuration. L'exemple ci-dessous illustre l'utilisation de vraies variables d'instance, ce qui, selon moi, est le plus grand avantage. Si vous n'avez pas besoin de variables d'instance et êtes satisfait uniquement des variables publiques ou privées, il existe probablement des systèmes plus simples.Wow, ce n'est pas vraiment très utile en soi, mais jetez un œil à l'ajout d'une sous-classe:
Un autre avantage est la possibilité d'avoir des modules et un héritage basé sur les traits.
Un exemple de la classe person inclut le module bindable.
Divulgation: je suis Daniel X. Moore et voici mon
{SUPER: SYSTEM}
. C'est le meilleur moyen de définir une classe en JavaScript.la source
la source
Voici les façons de créer des objets en javascript, que j'ai utilisé jusqu'à présent
Exemple 1:
Exemple 2:
Exemple 3:
Exemple 4: Avantages réels d'Object.create (). veuillez consulter [ce lien]
Exemple 5 (Object.create de Crockford personnalisé):
Pour garder la réponse à jour avec ES6 / ES2015
Une classe est définie comme ceci:
la source
Je pense que vous devriez lire l' héritage prototypique de Douglas Crockford en JavaScript et l'héritage classique en JavaScript .
Exemples de sa page:
Effet? Il vous permettra d'ajouter des méthodes de manière plus élégante:
Je recommande également ses vidéos: JavaScript avancé .
Vous pouvez trouver plus de vidéos sur sa page: http://javascript.crockford.com/ Dans le livre de John Reisig, vous pouvez trouver de nombreux exemples sur le site Web de Douglas Crockfor.
la source
'strings'
beaucoup de choses des définitions de fonctions avec des noms réels , mais l'élégance n'en fait pas partie ...Parce que je n'admettrai pas le plan d'usine YUI / Crockford et parce que j'aime garder les choses autonomes et extensibles, c'est ma variation:
où idéalement le test typeof est sur quelque chose comme la première méthode prototypée
la source
Si vous optez pour la simplicité, vous pouvez éviter complètement le "nouveau" mot clé et utiliser simplement des méthodes d'usine. Je préfère cela parfois, car j'aime utiliser JSON pour créer des objets.
Cependant, je ne sais pas quel est le niveau de performance pour les gros objets.
la source
C'est la façon dont TypeScript compile la classe avec le constructeur en JavaScript.
la source
La manière la plus simple est:
La raison en
that
est que celathis
peut être lié à autre chose si vous donnez une méthode en tant que gestionnaire d'événements, vous enregistrez donc la valeur pendant l'instanciation et l'utilisez plus tard.Edit: ce n'est certainement pas le meilleur moyen, juste un moyen simple. J'attends aussi de bonnes réponses!
la source
Vous souhaitez probablement créer un type à l'aide du modèle de pliage:
Ce code vous donnera un type appelé myType . Il aura des champs privés internes appelés bascule et texte . Il aura également ces membres exposés: les champs comptent et nombre ; les propriétés bascule , text et numberLength ; les méthodes incrementNumbersByCount et tweak .
Le modèle de pliage est détaillé ici: Modèle de pliage Javascript
la source
Code golf pour la réponse de @ liammclennan .
la source
MooTools (My Object Oriented Tools) est centré sur l'idée de classes . Vous pouvez même étendre et implémenter avec héritage.
Une fois maîtrisé, il permet un javascript puissant et ridiculement réutilisable.
la source
Classes basées sur des objets avec héritage
Simple, doux et fait tout.
la source
Une base
Une classe
action
la source
Sur la base de l'exemple de Triptyque, cela pourrait même être plus simple:
Cela ne crée qu'une seule instance d'objet, mais est toujours utile si vous souhaitez encapsuler un tas de noms de variable et de méthodes dans une classe. Normalement, il n'y aurait pas les arguments "Bob, M" au constructeur, par exemple si les méthodes étaient des appels à un système avec ses propres données, comme une base de données ou un réseau.
Je suis encore trop nouveau avec JS pour voir pourquoi cela n'utilise pas la
prototype
chose.la source
JavaScript est orienté objet , mais il est radicalement différent des autres langages OOP comme Java, C # ou C ++. N'essayez pas de le comprendre comme ça. Jetez cette vieille connaissance et recommencez. JavaScript a besoin d'une réflexion différente.
Je suggère d'obtenir un bon manuel ou quelque chose sur le sujet.
J'ai moi-même trouvé les tutoriels ExtJS les meilleurs pour moi, même si je n'ai pas utilisé le framework avant ou après l'avoir lu. Mais cela donne une bonne explication de ce qui se passe dans le monde JavaScript.Désolé, il semble que ce contenu ait été supprimé. Voici un lien vers la copie archive.org à la place. Fonctionne aujourd'hui. : Pla source
la source