|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Bonjour à tous,
J'utilise actuellement le script de John Resig pour fournir de l'héritage à mes "classes" Javascript mais sa méthode de déclaration par objet littéral ne permet pas de fourni des fonctionnalités intéressantes en termes de scope (i.e. les variable sont uniquement publiques et on ne peut pas faire de différence entre publique/privée, etc... sans déclarer ça à côté, après la déclaration de l'objet -> dégeulasse). Je cherche donc une manière de déclarer mes classes sous forme de fonction où il est possible de différencier les scopes comme évoqué dans cet article : Robert Nymann. Mais voila, je perds un aspect important de la programmation objet à mon sens : l'appel à super() que Resig inclue nativement dans son script. Je ne vois pas comment le reproduire lorsque les classes sont déclarées comme Robert Nymann le préconise. Est-ce que quelqu'un aurait une idée, l'a déjà réalisé? Ca me permettrai à la fois d'avoir les scopes, plus l'héritage et super (qui ne nécessite pas de répendre le nom de la classe parent à tous les 4 coins du fichier sinon en effet il est facile de reproduire cet appel avec le prototype du parent). En vous remerciant par avance, je sais que JS n'est pas un langage à vocation à faire de l'objet mais vu qu'on peut y arriver je saisi l'opportunité comme je le peux. |
|
|
00
|
|
|
#2 | |
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
Citation:
![]() Sauf que ce n'est pas de l'OO par classes mais par prototype.
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
J'avais fais un truc du genre y'a un an (mon niveau JS était pas terrible en fait à l’époque) donc si je devais le refaire aujourd'hui, je le ferai différemment et bien mieux.
|
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
salut,
je nuance le commentaire de Bovino. Javascript n'est pas spécifiquement orienté objet par prototype. Il est possible de faire l'objet. Mais il faut juste aborder l'OO de manière différente de la classique. Bien sûr, il est possible de se rapprocher du fonctionnement classique par l'approche prototypale, mais bon, (à ma connaissance), il reste les problèmes de propriétés privées & cie. De la même manière une approche uniquement par closure, limite l'approche par super (problème de scope en héritant de fonctions etc), et quand bien même atteinte nécessite de passer par une librarie etc. Je pense donc, que vouloir l'approche classique habituelle est mauvaise. Personnellement, je suis plutot fan de l'approche par closure, avec le passage en parametre d'un objet publique partagé parmi la hiérarchie. La raison qui me motive ezt que globalement, il n'y a pas tant que ça de niveau de hiérarchie, (deux ou trois tout au plus), et qu'il faut plutot favoriser beaucoup de composants (par composition justement) plutot qu'une structure verticale. Dans ce cas là, certes il faut être cohérent en jonglant in-hiérarchie, mais ca permet de s'en sortir plutot pas mal. Après, c'est vrai qu'il faut réfléchir à ce qu'on fait, et que je manque d'expérience sur des projets d'envergure relative. |
|
|
00
|
|
|
#5 | |||
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
Citation:
En JavaScript, non seulement tout est objet, mais aussi tout possède un prototype. Ensuite, en fonction de ce que l'on fait, il est possible, à l'instar de Mr Jourdain, de faire de l'OO sans le savoir (puisque souvent, on utilise majoritairement des prototypes natifs de JavaScript : String, Number, Function, etc.) mais c'est surtout l'approche procédurale qui n'existe pas à proprement parler en JavaScript. Et du coup, je trouve que vouloir reproduire en JavaScript le comportement d'un langage OO par classes est aller à l'encontre de la nature du langage et me semble assez maladroit en général. D'autant que de mémoire, je ne me souviens pas d'un cas où cela m'aurait réellement été utile. Ensuite, oui, il est possible de "simuler" des propriétés et méthodes privées et publiques (voire protégées). Quant à l'héritage, il se fait simplement par le prototype : Code :
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
|||
|
10
|
|
|
#6 | ||||
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
Citation:
En REVANCHE, créer une simple constructeur de la forme Code :
Citation:
Tu veux créer le jeu de la vie. On crée donc une fonction/constructeur automate. Il existe des automates synchrones et asynchrones (asynchrones pour la fourmie de langton par exemple). On aurait donc envie de dev une interface du style, tick; refresh, qui actualise l'automate et le met à jour, ainsi que dans les classes filles de défininir tick, et refresh. Bon, clairement dans ce cas là, on peut avoir besoin de se servir des services du constructeur parent (dont l'approche classique serait de dire classe abstraite). Une approche prototypale force les propriétés du parent et des filles à être publiques... une approche par closure permet de conserver les propriétés privées et de réutiliser les méthodes parent par l'objet publique passé en paramètre... La question de l'héritage me semble triviale par prototype. Dans le cas d'une approche par closure, on ne peut se contenter que d'un couple décorateur/paramètre publique, qui n'est pourtant pas si moche. Donc non, l'approche objet en javascript n'est pas forcément prototypale. |
||||
|
|
00
|
|
|
#7 | |||||||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
Citation:
Code :
J'ai donc vite recodé tout ça qui à l'air de rudement bien répondre aux bases minimales : Code :
version avec qqes tests : Code html :
edit: remplacez "super" par un autre mot (uber ou _super) dans le code car je pense que "super" est un mot clé. |
|||||||||
|
|
10
|
|
|
#8 | ||
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
@galerien69 : ta fonction propper n'est pas un constructeur
Un constructeur doit servir à créer des instances de ce constructeur. Ici, il me semble que tu confonds un objet en tant qu'instance de l'objet natif Object et un objet en tant qu'instance d'un constructeur. Du coup, pour personnaliser le prototype, c'est celui d'Object qu'il faut utiliser : Code :
@fanfouer : désolé si on empiète sur ta question, mais la discussion est intéressante
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
||
|
00
|
|
|
#9 | ||
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
Citation:
Etonnamment, JavaScript se réserve (pour d'éventuelles évolutions futures) la plupart des mots clés habituellement utilisés en POO par classes. D'où d'ailleurs la propriété des objets HTMLElement className pour éviter d'utiliser class Citation:
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
||
|
00
|
|
|
#10 | |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
Citation:
Donc la fonction propper, elle construit bien un object. C'est en ce sens que je l'appèle constructeur, même si c'est vrai que le mot clé new n'est pas nécessaire. Pour ce qui est d'étendre l'objet par prototype, oui ca serait la solution technique, je pense que nous savons tous deux, que ce n'est pas très joli. |
|
|
|
00
|
|
|
#11 | |||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#12 |
|
Membre chevronné
![]() Krusty Inscription : mai 2009 Messages : 472 ![]() |
a chaque que je voit une conversation sur la poo je me dit que c'est vraiment de la merde car il n'y a jamais reelement de resolution au probleme et que l'on se retrouve rapidement dans du charabia qui ne motive pas a apprendre la poo car si on l'apprend et au finale on se retrouver a se poser un miliard de questions a savoir quelle est la meilleur facon d'utiliser la poo pourquoi l'apprendre ? sans compter que l'on ne voit jamais d'exemple pratique reel a l'inverse du virtuelle que l'on rencontre tout le temp dans son utilisation.
et vive le procedurale
__________________
programmer n'est pas connaitre tous les moindres détails d'un langage mais savoir exploiter sous toutes ses facettes ce que l'on connait. |
|
|
00
|
|
|
#13 | |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
bjr,
deux remarques pour le script de willpower. On a vu (enfin je lui fais confiance!) que les variables peuvent être privées. Egalement publiques. Elles ne peuvent pas être protected, (cad accéder à une variable parent uniquement par ses fils). Concernant la remarque des références, je veux bien savoir comment on pourrait s'en sortir en faisant qqch de joli, parce que si c'est pour voir un saverManager dans un gUtils... . S'il y a quelque chose de stylé ça m'intéresse.Citation:
|
|
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
Citation:
Le problème ici en javascript est que beaucoup veulent souvent essayer d'adopter son approche par classe comme dans les autres langages alors évidement ça pose problème plutôt que simplement se plier aux outils de prototype offert par javascript et tout aussi puissant. |
|
|
|
10
|
|
|
#15 |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
ben honnêtement, je trouve que l'inherits proposé n'est pas pertinent (trop complexe). Ca fait joli, on peut redéfinir des méthodes, avoir super, d'une façon "classique".
mais bon, on peut très bien aborder le problème par composition...à la manière d'un décorateur. Tant pis pour les calls à upperMethode. |
|
|
00
|
|
|
#16 | |||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
Citation:
Sinon effectivement il n'existe pas réellement les notions de publique/privé en javascript. Ce sont plus des notions de scopes de variables. Enfin évidement que protected n'existe pas du fait que l'héritage n'existe pas et donc aucune règle pour définir un objet fils. tu peux néanmoins faire des trucs tordus qui s'en approchent: Code :
|
|||
|
|
00
|
|
|
#17 |
|
Nouveau Membre du Club
![]() Étudiant Inscription : janvier 2008 Messages : 128 ![]() |
Whaou bonsoir messieurs (dames)
Je ne souhaitais pas tant déchainer les foules mais merci d'avoir répondu présent. Je crois que l'approche Willpower (en complétant le prototype de Function) est intéressante. Sur le pourquoi de la chose : je développe quelque chose d'assez conséquent uniquement orienté objet. Ca a commencé en PHP, et c'est finalement destiné à être utilisé sur plusieurs plateformes donc plusieurs langages. Il serait dommage de modifier la structure de ce projet suivant le langage sachant que si une modification intervient, je vais devoir faire une étude pour toutes les implémentations. J'ai bien conscience que ma demande ne rentre pas dans les prérogatives de javascript (je suis bien d'accord avec le message de Bovino, je m'étais mal exprimé) mais je préfère gagner du temps par la suite sur ce coup. En outre, je ne mets pas n fonctionnements en jeu, pratique pour cibler un problème quelque soit l'édition du projet. Merci pour vos réponses, et n'hésitez pas à continuer le débat. |
|
|
00
|
|
|
#18 | ||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
De rien, c'est un des sujets qui me passionne le plus ^^
Code :
Code :
|
||||
|
|
00
|
|
|
#19 | ||||||
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
dsl willpower, je voulais étayer mais l'apéro et tout se sont enchaînés...j'ai zappé.
Donc par gUtils, c'est pas une librairie qui existe, c'est un pondu de mon imagination pour dire qu'en gros, avoir un truc qui gère les ref de fonctions, ca need d'aller dans une variable globale, (à la manière d'une librairie), et que du coup on pollue un peu windows pour des soucis d'optimisation. pour ce qui est de ta proposition pour les membres protégés, c'est intéressant, mais j'avouerais avoir du mal à faire l'application avec les constructeur. Quelle est la diff avec une méthode publique? Sinon, on peut extrapoler aux attributs de classes sans passer par des getters : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#20 | |||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 867 ![]() |
Citation:
effectivement ta version est plus sympa (je n'avais jamais pensé à la chose avant de l'écrire en direct dans ce sujet donc ma version était précaire^^) par contre ton dernier exemple n'a plus grand chose à voir avec l'héritage, tu fais juste appel à un constructeur d'objet contenant des fonctions. en reprenant ton premier exemple ça donnerait donc : Code :
|
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com