Oui, malheureusement. Il serait agréable de pouvoir ajouter des fonctionnalités en manipulant les prototypes DOM, mais en pratique ce n'est pas fiable étant donné la technologie d'aujourd'hui.
Document
, Element
et d'autres peuvent être des 'objets hôtes' implémentés par le navigateur sans pouvoir manipuler leurs prototypes. Les objets hôtes peuvent potentiellement avoir beaucoup d'autres comportements étranges qu'un objet JavaScript natif ne pourrait pas avoir. Les nœuds DOM sont des objets hôtes dans IE6-7 et de nombreux navigateurs de niche et mobiles plus anciens.
Même s'ils sont implémentés en tant qu'objets JavaScript natifs, il n'y a pas encore de standard (encore) qui décrit où la fonction constructeur pour eux doit être trouvée, pour vous permettre de pêcher dans le .prototype
. Document
, Element
et ainsi de suite ne sont que des noms d'interface DOM W3, ils ne disent rien sur ce que les objets d'implémentation doivent être trouvés.
Il arrive que les navigateurs modernes (IE8 mode natif et les versions récentes de Firefox, Opera et WebKit) rendent les fonctions constructeurs disponibles afin que vous puissiez commencer à ajouter des méthodes à Document
ou HTMLElement
. Mais même dans ce cas, il existe des différences entre les objets exposés, car tous les navigateurs ne fournissent pas aux interfaces DOM des implémentations sous les mêmes noms. (Les sous-interfaces/implémentations de NodeList
sont particulièrement problématiques.)
Vous pouvez voir comment le prototypage DOM a fonctionné dans la pratique en regardant le framework Prototype.js. Quand ça marche, c'est super lisse. Mais parce que vous ne pouvez pas prototyper partout, vous vous retrouvez avec des choses extrêmement moche où le cadre doit faire face à des endroits où le prototypage ne fonctionnera pas en copiant des méthodes dans chaque instance d'un nœud. Et puis vous avez la situation où votre code pourrait oublier qu'il doit forcer cette 'augmentation' et donc cela pourrait fonctionner ou ne pas fonctionner selon si une autre fonction est arrivée à augmenter le même nœud auparavant. Cela conduit à une horrible douleur de débogage spécifique à un navigateur, spécifique à un ordre d'interaction, à une condition de course.
Si vous pouvez limiter votre travail de prototypage à quelques interfaces bien supportées et abandonner tous les navigateurs sauf les plus récents, vous pouvez probablement vous en sortir.
Ce n'est vraiment pas clair ce que vous demandez ici. – Robusto
Je parle de Element.prototype et Document.prototype (HTMLDocument.prototype). Quelle est la raison de ne pas les utiliser, s'il y en a? –