Étendre Number.prototype dans javascript et l'objet Math?

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 :

  1. Il fonctionne aussi pour les non-nombres: 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)
  2. Certains membres de l'objet Math n'appartiennent pas à une valeur de numéro "primaire", comme Math.min() ou Math.max() . Ou voulez-vous l'utiliser comme a.max(b) ?
  3. Les autres membres sont globaux et n'appartiennent pas à un numéro spécialisé. Les exemples sont des constantes comme 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:

  • Emballage du nombre dans une variable au lieu d'une simple valeur statique (le cas le plus souvent)
    • NNum.round ();
  • Emballage de la valeur statique simple entre parenthèses:
    • (123) .round ();
  • Appel utilisant la notation de crochet
    • 123 ["round"]. Call ();