Pergunta

Eu sempre me perguntei por que o Javascript tem o objeto Math global em vez de dar números seus próprios métodos. Existe uma boa razão para isso?

Também existem desvantagens (exceto eficiência) para fazer algo como isto:?

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

Apenas para deixar claro, eu entendo que constantes como p algum lugar necessidade e funções que são aplicadas em mais de um número como min / max. A questão foi, principalmente, a respeito dos métodos que só efetuar um único número, como redondo, abs, pecado, prisioneiro de guerra, etc.

Foi útil?

Solução

A razão para o objeto Math é simples: "porque o Java faz isso". Não é o melhor de razões, mas aqui estamos. Acho que as coisas feito mais sentido na época, antes de Douglas Crockford começou sua campanha para metade suprimir o idioma *. Originalmente você estava "permitido", ou quis dizer, para fazer coisas como esta:

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

A desvantagem de aumentar Number.prototype é que alguém pode fazer a mesma coisa. Ou pior, por exemplo, definir Number.prototype.round como um simétrica função de arredondamento.

Se você está procurando maneiras de tornar sua vida mais fácil, por que parar aí? Por que não simplesmente incluir funções Math como funções globais?

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] ];
}

Este vai cair todas as funções matemáticas para o escopo global, permitindo efetivamente que você parar de digitar "Math". Pergunte a si mesmo:? Existe alguma diferença real entre estendendo Number e estendendo window com estas funções

* Antes que você me chama: O comentário Crockford não é para ser levado muito a sério. Eu concordo com ele que with é muito perigoso em um ambiente global implícito.

Outras dicas

Não há problema em estender Number.prototype que não confundir outras pessoas. Qual é o ponto? O que é melhor em usar value.round() vez de Math.round(value)?

Existem várias boas razões para o objeto Math:

  1. Ele funciona para não-números, também: Math.round("5") funciona enquanto value.round() não vai funcionar quando o valor é uma string (por exemplo, o valor de uma caixa de texto)
  2. Alguns membros do objeto Math não pertencem a um valor numérico "primário", como Math.min() ou Math.max(). Ou você quer usá-lo como a.max(b)?
  3. Outros membros são globais e não pertencem a um número especializada. Exemplos são constantes como Math.PI ou o Math.random() função.

Tente fazer 123.round();

Seu console javascript vai jogar algumas centenas de erros para os seus olhos: P, nah ...

Você pode fazer:

Number.prototype.x então: (123).x(); mas nunca 123.x();

Eu acho que a matemática é mais do que conjunto de métodos numéricos. É o uso mais amplo. Dizer, usando NumberVariable.PI pode ser confuso. Mesmo com a geração de números aleatórios.

Número Também acho estendendo é OK, porque é a parte do JS natureza. Talvez alguém me corrija se eu estiver errado aqui.

Acredito que chamá-lo desta forma funciona bem, desde funções protótipo do número de trabalho apenas como funções protótipo qualquer outro objeto que:

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

Assim, a conversa sobre se é uma boa idéia ou não de lado, você pode fazer isso muito bem.

Você pode fazer 123.x (), mas o intérprete para js está quebrado (uma vez que não interpreta o ponto como expedição mensagem)

Estranhamente, você pode usar 123 .x () (com um espaço entre o número e o ponto) em vez, e ele vai trabalhar.

123..also obras mas isso é porque você efetivamente fez um decimal e, em seguida, despachando a ele

(typeof 123.) === 'número') // true

Tente:

Number.prototype.times = function (outro) {return este outro *}; 3 .times (5);

no console.

A minha opinião sobre isso é que se você fazer as verificações adequadas quanto à funcionalidade nativa não substituir, nome com a compreensão de padrões de nomes nativos e faz seu código mais legível e gerenciável, em seguida, fazer o seu código confortável e conveniente.

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

Quanto a usar isso, por causa da natureza de javascript, eu acredito que a melhor maneira de fazer isso é:

  • Embalagem o número em uma variável em vez de um simples valor estático (o caso mais frequente)
    • nNum.round ();
  • Embalagem o valor estático simples entre parênteses:
    • (123) .round ();
  • Chamar usando a notação de colchete
      .
    • 123 [ "rodada"] call ();

Você pode fazer isso

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top