Je cherche une réponse définitive à la raison pour laquelle l'extension des prototypes intégrés est si fortement châtiée dans la communauté des développeurs JS. J'utilise le framework Prototype JS depuis un certain temps, et pour moi, cela [1,2,3].each(doStuff)
semble beaucoup plus élégant que $.each([1,2,3], doStuff)
. Je sais que cela crée une "pollution de l'espace de noms", mais je ne comprends toujours pas pourquoi c'est considéré comme une mauvaise chose. Y a-t-il également une dégradation réelle des performances associée à l'extension des prototypes intégrés? Merci!
15
for(var ... in ...)
boucles sont gâchées car les fonctions prototypes sont également passées.Réponses:
Je vous suggère de lire cet article qui, je pense, explique assez bien pourquoi l'extension d'objets est une mauvaise idée, en ce qui concerne Prototype également.
En résumé:
Manque de spécifications
Les objets hôtes n'ont pas de règles
Risque de collisions
Frais généraux de performance
IE DOM est un gâchis
Bonus: les bugs du navigateur
la source
Une autre raison est la lisibilité / maintenabilité du code. Si un autre développeur (en particulier un débutant) lit mon code et voit
[0, 1, 2].foo(...)
, il peut ne pas savoir quelle est la méthode foo ou où trouver la documentation / source pour cela. Est-ce que foo est une extension du langage ajouté par prototype.js, ou par une autre bibliothèque en cours d'utilisation, ou par une autre partie de mon code dans un autre fichier, ou est-ce une méthode JavaScript native qu'ils ne connaissaient pas? Ils ont besoin de le rechercher et peuvent ne pas le trouver tout de suite (ou s'il y a des conflits, ils peuvent ne pas trouver le bon).Avec l'approche jQuery, si vous voyez
$.foo(...)
, l'espace de noms de la méthode foo rend évident où trouver sa définition / documentation si vous ne savez pas ce qu'elle fait.la source
Voici le problème de base: que se passe-t-il si vous disposez de deux outils qui étendent les prototypes de manière incompatible ou qui étendent les méthodes communément appelées de manière à produire des résultats différents (c'est un problème particulier pour
for...in
JavaScript), provoquant ainsi un code qui repose sur sur leur comportement normal pour briser?Fondamentalement, ce sont les mêmes problèmes que vous rencontrez lorsque vous utilisez mal les variables globales. En soi, il ne se passe peut-être rien de mal. Mais, cela vous ouvre des problèmes lorsque deux morceaux de code ostensiblement séparés se marchent soudainement (et c'est difficile de déboguer lorsque cela se produit).
Certes, prototype.js est assez bien connu et la plupart des outils fonctionnent autour de ce qu'il fait. De même, je suis sûr qu'il existe des cas où l'extension des prototypes de base est la bonne chose à faire. Mais c'est quelque chose à aborder avec prudence.
la source
Je ne sais pas si c'est vraiment toujours un problème, mais mon expérience avec les versions antérieures d'Internet Explorer est que parfois il n'était même pas possible d'étendre certains types de build-in.
la source
Il y a deux problèmes distincts ici. Le premier est l'extension générale des prototypes intégrés, et l'autre étend spécifiquement les prototypes DOM. Les arguments contre l'extension des prototypes intégrés:
Array.prototype
ouObject.prototype
peut avoir des effets d'entraînement, comme l'ajout des méthodes d'extension énumérées dans unefor...in
boucleQuant à l'extension des prototypes DOM, l'argument de conflit potentiel ci-dessus s'applique toujours. De plus, les nœuds DOM sont des objets hôtes et en tant que tels ne sont soumis à aucune des règles normales des objets JavaScript natifs. Ils peuvent essentiellement faire ce qu'ils veulent et n'ont aucune obligation de fournir des objets prototypes sensibles ou même d'autoriser des propriétés supplémentaires ("expando"). IE à des exercices particuliers ce droit, à condition qu'aucun prototype pour les objets DOM avant IE 9 et ayant différentes propriétés sur bizarreries sur les différents objets DOM (bien que vous êtes propriétés généralement OK à Assigner des éléments fournis, l'ensemble de rien
document.expando
àfalse
.)la source