Dois-je utiliser le polymorphisme en javascript?
Je suis un programmeur qui a programmé dans plusieurs langues, à la fois fonctionnelle et OO orienté. J'ai programmé quelques Javascript aussi, mais jamais utilisé (ou utiliser) le polymorphisme en elle.
Maintenant, comme une sorte de hobby projet, je tiens à port de certaines applications qui ont été écrits en Java et C# qui utilisent beaucoup polymorhpism de Javascript.
Mais au premier regard, j'ai lu beaucoup de " C'est possible, mais ...'
Donc, il y a une alternative?
Un exemple de ce que je voudrais écrire en JS dans pseudolang :
abstract class Shape{ { printSurface() } ; }
class Rect : Shape() { printSurface() { print (sideA*sideB}}
class Circle : Shape() { printSurface() { print { pi*r*r }}
TheApp { myshapes.iterate(shape s) {s.printSurface() } }
Donc un classique polymorphes cas : itération sur baseclass.
J'aimerais réaliser ce genre de comportement. Je sais que c' est polymorhism, mais existe-il d'autres "patrons" que je suis négliger le fait que réaliser ce genre de comportement ou devrais-je étudier à l'héritage possibilités en Javascript?
Vous devez vous connecter pour publier un commentaire.
Comme l'a dit, le JavaScript est une dynamique tapé langage basé sur les prototypes de l'héritage, de sorte que vous ne pouvez pas vraiment utiliser la même approche des langages à typage. Un JS version de ce que vous avez écrit, pourrait être:
Ensuite, dans votre application:
Ou, avec le duck-typing:
Le froid ont également
Shape
comme objet sans constructeur, que c'est plus "classe abstraite" comme:Avis que, dans ce cas, vous ne pouvez pas utiliser
instanceof
plus, ou vous secours à duck-typing ou vous devez utiliserisPrototypeOf
, mais il est disponible uniquement dans les navigateurs récents:Objet.créer n'est pas disponible dans le navigateur qui n'est pas de mettre en œuvre ES5 specs, mais vous pouvez facilement utiliser un polyfill (voir le lien).
[LenientThis]
erreur est sorti.Le "motif" dans le jeu serait ici "interface". Aussi longtemps que tous les objets de la
myshapes
de collecte de mettre en œuvre lesprintSurface()
méthode, vous serez amende.Javascript est un typées dynamiquement la langue, les objets d'une collection n'a pas besoin d'être liés à tous.
je sais que cela peut être fait avec prototypes mais je ne suis pas un maître de l'utiliser. je préfère l'objet littéral approche (plus facile à visualiser, et a un "privé" portée)
Comme Weston dit, si vous n'avez pas la nécessité pour l'héritage, puis le canard tapé la nature d'un langage dynamique comme Javascript vous donne polymorphisme car il n'est pas nécessaire dans la langue elle-même pour un typage fort de la base de la classe ou de l'interface.
Si vous ne voulez pas utiliser l'héritage et faire des choses comme l'appel d'une super-classe de mise en œuvre facilement alors cela peut être réalisé à l'aide de prototypes ou d'objets littéraux comme indiqué par Joeseph.
Une autre chose serait de se pencher sur Coffescript depuis cette compile vers du Javascript vous donnant toutes les OO bonté dans une syntaxe simple. Il va écrire tous les bollerplate prototypage choses pour vous. L'inconvénient est qu'il apporte ce supplément d'étape de compilation. Que dit l'écriture d'une simple hiérarchie de classe comme votre exemple ci-dessus et ensuite voir ce javascript apparaît comme un résultat permet de montrer comment il peut être fait.
Sur une autre note. Si vous souhaitez programmer le code Javascript dans un OO style à l'aide de classes, on peut le voir dans les nombreuses "classe-systèmes" pour le Javascript. Un exemple est Joose (http://joose.it).
De nombreux clients côté des cadres de mettre en place leur propre système de classe. Un exemple de ceci est ExtJS.