Je me suis toujours demandé pourquoi Javascript possède l'objet mathématique mondial au lieu de donner des chiffres à leurs propres méthodes. Y a-t-il une bonne raison?
De plus, at-il des inconvénients (autres que l'efficacité) pour faire quelque chose comme ça ?:
Number.prototype.round = function(){ return Math.round(this); };
Juste pour préciser, je comprends que des constantes comme π nécessitent quelque part et des fonctions qui sont appliquées sur plus d'un nombre comme min / max. La question concernait principalement les méthodes qui n'entrent que sur un seul nombre tel que round, abs, sin, pow, etc.
La raison de l'objet Math
est simple: "parce que Java le fait". Pas le meilleur des raisons, mais ici nous sommes. Je pense que les choses avaient plus de sens alors, avant que Douglas Crockford ne commence sa campagne pour supprimer la moitié de la langue *. À l'origine, vous étiez "autorisé", ou voulait dire, de faire des choses comme ceci:
with (Math) { var n = min( round(a) * round(b), sqrt(c) ); var result = exp( n + d ); }
L'inconvénient de l'extension de Number.prototype
est que quelqu'un d'autre pourrait faire la même chose. Ou pire, par exemple, définissez Number.prototype.round
comme une fonction d'arrondi symétrique .
Si vous cherchez des façons de faciliter votre vie, pourquoi vous arrêter là-bas? Pourquoi ne pas simplement inclure les fonctions Math
comme fonctions globales?
var m = 'abs acos asin atan atan2 ceil cos exp floor log max min ' + 'pow random round sin sqrt tan PI').split(' '); for (var i=0,l=m.length; i<l; i++) { window[ m[i] ] = Math[ m[i] ]; }
Cela réduira toutes les fonctions mathématiques dans la portée globale, ce qui vous permettra effectivement de cesser de taper "Math". Demandez-vous: Existe-t-il une différence réelle entre l'extension du Number
et l'extension de la window
avec ces fonctions?
* Avant de me flamber: le commentaire de Crockford ne doit pas être pris au sérieux. Je suis d'accord avec lui qui est très dangereux dans un environnement global implicite.
Il n'y a aucun inconvénient pour étendre Number.prototype
autre que confondre les autres personnes. À quoi ça sert? Quel est le meilleur dans l'utilisation de value.round()
au lieu de Math.round(value)
?
Il existe plusieurs bonnes raisons pour l'objet Math
:
Math.round("5")
fonctionne alors que value.round()
ne fonctionnera pas lorsque la valeur est une chaîne (par exemple, la valeur d'une zone de texte) Math.min()
ou Math.max()
. Ou voulez-vous l'utiliser comme a.max(b)
? Math.PI
ou la fonction Math.random()
. Essayez de faire 123.round();
Votre console javascript jettera quelques centaines d'erreurs dans vos yeux: P, nah …
Tu peux faire:
Number.prototype.x
puis: (123).x();
Mais jamais 123.x();
Je pense que Math est plus que le nombre de méthodes Number. Son utilisation est plus large. Dites, l'utilisation de NumberVariable.PI peut être source de confusion. Idem avec la génération de nombres aléatoires.
Aussi, je pense que le nombre d'extension est correct, car c'est la partie de la nature de JS. Peut-être que quelqu'un va me corriger si je me trompe ici.
Je crois que l'appeler de cette façon fonctionne aussi bien, puisque les fonctions de prototype de Number fonctionnent comme toutes les autres fonctions du prototype d'un objet:
5.5["round"](); //should return 6
Alors, la conversation sur sa bonne idée ou non, vous pouvez faire cette amende.
Vous pouvez faire 123.x () mais l'interpréteur pour js est cassé (car il n'interprète pas le point comme envoi de message)
Par hasard, vous pouvez utiliser 123 .x () (avec un espace entre le nombre et le point) et cela fonctionnera.
123 … fonctionne aussi, mais c'est parce que vous avez effectivement fait une décimale et que vous l'envoyez
(Typeof 123.) === 'number') // true
Essayer:
Number.prototype.times = function (autre) {retournez cette * autre}; 3 fois (5);
Dans la console.
Ma vue à cela est que si vous faites les vérifications appropriées pour ne pas remplacer les fonctionnalités natives, le nom avec la compréhension des normes de dénomination natives et rend votre code plus lisible et gérable, puis faites votre code confortable et pratique.
if (Number.prototype.round == null) Number.prototype.round = function() { return Math.round(this); }
Pour ce faire, en raison de la nature de javascript, je crois que la meilleure façon de le faire est: