Il n'y a pas d'inconvénient mesurable, comme une baisse de performance. Du moins, personne n'en a parlé. Il s'agit donc d'une question de préférence et d'expériences personnelles.
Le principal argument pro : Il a une meilleure apparence et est plus intuitif : sucre de syntaxe. Il s'agit d'une fonction spécifique à un type/instance, elle doit donc être spécifiquement liée à ce type/instance.
Le principal argument contre : Le code peut interférer. Si la librairie A ajoute une fonction, elle pourrait écraser la fonction de la librairie B. Cela peut casser le code très facilement.
Les deux ont raison. Lorsque vous vous appuyez sur deux bibliothèques qui changent directement vos types, vous finirez très probablement par avoir un code cassé car la fonctionnalité attendue n'est probablement pas la même. Je suis tout à fait d'accord sur ce point. Les macro-bibliothèques ne doivent pas manipuler les types natifs. Sinon, en tant que développeur, vous ne saurez jamais ce qui se passe réellement dans les coulisses.
Et c'est la raison pour laquelle je n'aime pas les librairies comme jQuery, underscore, etc. Ne vous méprenez pas ; elles sont absolument bien programmées et fonctionnent comme un charme, mais elles sont grand . Vous n'en utilisez que 10 % et n'en comprenez qu'environ 1 %.
C'est pourquoi je préfère un approche atomistique où vous ne demandez que ce dont vous avez vraiment besoin. De cette façon, vous savez toujours ce qui se passe. Les micro-bibliothèques ne font que ce que vous voulez qu'elles fassent, elles n'interfèrent donc pas. Dans le contexte où l'utilisateur final sait quelles fonctionnalités sont ajoutées, l'extension des types natifs peut être considérée comme sûre.
TL;DR En cas de doute, n'étendez pas les types natifs. N'étendez un type natif que si vous êtes sûr à 100% que l'utilisateur final connaîtra et voudra ce comportement. Sur pas de de manipuler les fonctions existantes d'un type natif, car cela briserait l'interface existante.
Si vous décidez d'étendre le type, utilisez Object.defineProperty(obj, prop, desc)
; si vous ne pouvez pas utiliser le type prototype
.
J'ai eu l'idée de cette question parce que je voulais Error
pour qu'ils puissent être envoyés via JSON. J'avais donc besoin d'un moyen de les stringifier. error.stringify()
était bien mieux que errorlib.stringify(error)
Comme la deuxième construction le suggère, j'opère sur errorlib
et non sur error
lui-même.