Question

Je me suis toujours demandé pourquoi Javascript avait un objet mathématique global au lieu de donner aux méthodes leurs propres méthodes. Y at-il une bonne raison pour cela?

Existe-t-il également des inconvénients (autres que l'efficacité) à faire quelque chose comme ceci?:

Number.prototype.round = function(){
    return Math.round(this);
};

Juste pour préciser, je comprends que les constantes telles que p ont besoin de quelque part et les fonctions appliquées à plusieurs nombres tels que min / max. La question portait principalement sur les méthodes qui n’affectent qu’un nombre unique, tel que round, abs, sin, pow, etc.

Était-ce utile?

La solution

La raison de l'objet Math est simple: "car Java le fait". Pas la meilleure des raisons, mais nous y sommes. Je suppose que les choses avaient plus de sens à l'époque, avant que Douglas Crockford ne commence sa campagne pour supprimer la moitié de la langue *. A l'origine, vous étiez "autorisé" ou vouliez faire des choses comme ceci:

with (Math) {
  var n = min( round(a) * round(b), sqrt(c) );
  var result = exp( n + d );
}

L'extension de Number.prototype présente l'inconvénient de faire en sorte que quelqu'un d'autre fasse la même chose. Ou pire, par exemple, définissez Number.prototype.round comme une fonction d'arrondissement symétrique .

Si vous cherchez des moyens de vous simplifier la vie, pourquoi s’arrêter là? Pourquoi ne pas simplement inclure des fonctions Math en tant que 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] ];
}

Toutes les fonctions mathématiques sont alors placées dans la portée globale, ce qui vous permet de cesser de taper "Math.". Posez-vous la question suivante: existe-t-il une réelle différence entre l'extension de Number et l'extension de la fenêtre avec ces fonctions?

* Avant de m'embraser: le commentaire de Crockford ne doit pas être pris trop au sérieux. Je conviens avec lui que avec est très dangereux dans un environnement global implicite.

Autres conseils

Il n’ya aucun inconvénient à étendre Number.prototype si ce n’est de dérouter d’autres personnes. À quoi ça sert? Quoi de mieux d’utiliser value.round () au lieu de Math.round (valeur) ?

L'objet Math a plusieurs bonnes raisons:

  1. Cela fonctionne aussi pour les non-nombres: Math.round ("5") fonctionne alors que value.round () ne fonctionne pas lorsque la valeur est un chaîne (par exemple, la valeur d'une zone de texte)
  2. Certains membres de l'objet Math n'appartiennent pas à un "primaire". valeur numérique, telle que 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é. Des exemples sont des constantes telles que Math.PI ou la fonction Math.random () .

Essayez de faire 123.round ();

Votre console javascript vous jettera quelques centaines d’erreurs: P, nah ...

Vous pouvez faire:

Number.prototype.x puis: (123) .x (); mais jamais 123.x ();

Je pense que Math est plus qu'un ensemble de méthodes numériques. C'est utilisation plus large. Disons que l’utilisation de NumberVariable.PI peut être source de confusion. Identique à la génération de nombres aléatoires.

De plus, je pense que l’extension d’un nombre est acceptable, car elle fait partie de la nature de JS. Peut-être que quelqu'un me corrigera si je me trompe ici.

Je crois que l'appeler de cette manière fonctionne également, car les fonctions de prototype de Number fonctionnent exactement comme toutes les fonctions de prototype d'Object:

5.5["round"]();
//should return 6

Donc, la conversation sur le fait de savoir si c'est une bonne idée ou pas, vous pouvez le faire très bien.

Vous pouvez faire 123.x () mais l'interpréteur de js est cassé (car il n'interprète pas le point comme un envoi de message)

Bizarrement, vous pouvez utiliser 123 .x () (avec un espace entre le nombre et le point) et cela fonctionnera.

123 .. fonctionne également, mais c'est parce que vous avez effectivement créé une décimale, puis que vous l'envoyez

  

(typeof 123.) === 'nombre') // true

Essayez:

  

Number.prototype.times = function (other) {renvoie this * autre}; 3 fois (5);

dans la console.

Mon opinion à ce sujet est que, si vous effectuez les contrôles appropriés pour ne pas écraser la fonctionnalité native, nommez-le et comprenez les normes de dénomination natives pour rendre votre code plus lisible et facile à gérer, puis rendez-le confortable et pratique.

if (Number.prototype.round == null)
    Number.prototype.round = function() { return Math.round(this); }

Pour utiliser cela, à cause de la nature de javascript, je pense que la meilleure façon de le faire est de:

  • Insérer le nombre dans une variable au lieu d'une simple valeur statique (le plus souvent)

    • nNum.round ();
  • Enveloppant la valeur statique simple entre parenthèses:
    • (123) .round ();
  • Appel en utilisant la notation entre crochets
    • 123 ["rond"]. call ();

Vous pouvez le faire

Number.prototype.round = function() {
    return Math.round(this.valueOf());
};

https://www.w3schools.com/jsref/jsref_prototype_num.asp

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top