Zeph (./2841) :
Pour les usages "page web" la bibliothèque telle que définie par le w3c est déjà pas mal. Tu citais par exemple jQuery, normalement il n'y a plus besoin de s'en servir depuis que document.querySelector est disponible partout (d'ailleurs c'est en partie pour ça que la lib est en train de mourir doucement).
Il n'y a pas que ça dans jQuery, quand même ^^ (même si c'est bien sûr le principal usage)
flanker (./2839) :
Et voilà, on retrouve une habitude de JS : ça ressemble à une table de hash, ça a le goût d'une table de hash, ça a l'odeur d'une table de hash, mais ce n'est pas une table de hash.
Mais justement : à aucun moment on ne t'a prétendu qu'il s'agissait de près ou de loin d'une table de hash, c'est simplement toi qui a tiré cette conclusion à partir de ta connaissance d'autres langages.
Je ne suis doublement pas d'accord :
- tout d'abord je trouve que c'est une très (très très) mauvaise idée de prendre une syntaxe qui est utilisée par beaucoup d'autres langages pour faire toute autre chose : la confusion était très largement prévisible ;
- ça ressemble quand même beaucoup à une table de hash, avec les méthodes keys(), values(), … il suffit de voir le nombre de sujets sur StackOverflow avec l'utilisation de {} comme réponse quand le demandeur cherche une hash table… D'ailleurs, je cite Mozilla : « Les objets sont similaires aux Maps, chacun manipulant des clés associées à des valeurs, récupérant ces valeurs, supprimant des clés... Il n'y avait auparavant pas d'alternatives natives et c'est pourquoi, historiquement, les objets JavaScript ont été utilisés comme des Maps », ou encore « Dans la plupart des scénarios, les objets restent une solution valide. »
Donc dire que {} n'a aucun rapport, même de loin, avec une hash table me semble un tantinet exagéré
Je peux te donner quelques exemples, mais avant il me semble plus important de répéter mon argument précédent : au lieu d'essayer de résoudre un problème, on essaie de reproduire un moyen. Plutôt que de trouver comment implémenter ce que je veux en utilisant l'héritage prototypal on essaie de l'implémenter avec des classes, mais comme ça n'existe(ait) pas en JS on se retrouve à implémenter un machin hybride qui fait presque comme des classes mais en utilisant les prototypes de JS. Je pense que l'approche "je veux implémenter de cette façon parce que c'est comme ça que je l'aurais fait dans le langage que je connais" n'est pas efficace. Du coup prendre un cas d'école de l'utilisation des classes et essayer de l'écrire en JS est idiot : bien sûr que ça sera moche, mais quel problème essaie-t-on de résoudre ? J'imagine que la réponse n'est pas "je veux une classe Client qui hérite de Person" mais quelque chose d'un peu plus concret, qui peut très certainement s'écrire de 1001 autres façons. C'est pas comme si le C était à court de solutions pour implémenter tout et n'importe quoi, et pourtant il n'y a ni classes ni prototypes.
Je ne suis pas d'accord. Simplement, je ne veux pas modifier les prototypes de base (cf. plus bas), donc je me retrouve à faire l'équivalent d'une classe (un nouvel objet que je vais peupler de propriétés).
Plein d'enthousiasme, j'ai cherché quelques tutos (c'était a long long time ago, donc ça a peut-être évolué depuis), et ils disaient tous la même chose : l'héritage par prototype, c'est fantastique, regardez comme on peut réimplémenter un système de classe facilement \o/
À l'inverse je peux trouver des cas d'utilisation qui sont favorables à l'héritage par prototype. Mettons par exemple que j'écrive un programme dans lequel j'ai fréquemment besoin d'obtenir l'opposé de chaque élément d'un tableau, je pourrais avoir envie d'une fonction "negate" disponible facilement (bouh, elle n'est pas disponible de base, quelle bibliothèque standard ridicule !). Une solution simple à ça serait de l'ajouter directement sur l'objet Array
Pour le coup, j'aurais surtout tendance à partir en courant !
Que se passe-t-il si une lib externe a aussi envie d'une fonction negate, mais avec un résultat différent pour null ou undefined ? La solution idéale pour avoir des bugs subtils et totalement incompréhensibles
C'est viable quand on bosse sans aucune lib externe, mais sinon, je trouve ça beaucoup trop dangereux.
L'autre argument concerne les garanties sur le code. Les types permet des garanties fortes sur le code. À partir du moment où tu modifies les propriétés de chaque type, le problème me semble beaucoup compliqué.
Ça se voit d'ailleurs très bien dans les IDE : l'analyse statique sur le JS est très très loin derrière celle du Python (pour deux langages que j'utilise un peu), malgré ma bonne volonté pour lui donner toutes les indications dont il a besoin tout en ayant un code structurellement plus simple.
Qu'on puisse changer les objets de base ne me choque pas pour des choses très précises (pour un débuggueur, par exemple), mais surtout pas pour du code classique.
Plus généralement je viens d'étendre la bibliothèque standard, ce qui est une fonctionnalité que pas mal de langages ont essayé de proposer (C# avec les méthodes d'extension, Python avec la méthode magique "__init__" au lieu de constructeurs, etc.).
Qu'est-ce que la méthode __init__ a de magique ? C'est un constructeur comme un autre, non ? Mais je ne vois pas trop en quoi elle étend la bibliothèque standard (je ne connais pas C#, donc je n'en dirais rien).