Подтвердить что ты не робот

Расширение Number.prototype в javascript и Math-объекте?

Я всегда задавался вопросом, почему Javascript имеет глобальный объект Math вместо того, чтобы давать номера своим собственным методам. Есть ли веская причина для этого?

Также есть ли какие-либо недостатки (кроме эффективности) делать что-то вроде этого?

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

Просто, чтобы четко прояснить, я понимаю, что константы, такие как π, нуждаются где-то и функции, которые применяются на более чем одном числе, например min/max. Вопрос касался главным образом методов, которые влияют только на одно число, такое как округление, абс, sin, pow и т.д.

4b9b3361

Ответ 1

Причина для объекта Math проста: "потому что Java это делает". Не лучшие причины, но мы здесь. Я предполагаю, что тогда это имело больше смысла, прежде чем Дуглас Крокфорд начал свою кампанию, чтобы подавить половину языка *. Первоначально вы были "разрешены" или имели смысл делать такие вещи:

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

Недостатком расширения Number.prototype является то, что кто-то другой может сделать то же самое. Или, что еще хуже, определите Number.prototype.round как симметричную функцию округления.

Если вы ищете способы сделать свою жизнь проще, зачем останавливаться на ней? Почему бы просто не включить функции Math в качестве глобальных функций?

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

Это уменьшит все математические функции в глобальном масштабе, что позволит вам перестать печатать "Math". Спросите себя: существует ли какая-либо реальная разница между расширением Number и расширением window с помощью этих функций?

* Перед тем, как вы меня планете: комментарий Крокфорда не относится к серьезному мнению. Я согласен с ним в том, что with очень опасен в неявной глобальной среде.

Ответ 2

Нет никакого недостатка в расширении Number.prototype других, чем запутывание других людей. Какой смысл? Что лучше использовать value.round() вместо Math.round(value)?

Существует несколько веских причин для объекта Math:

  • Он работает и для не-чисел: Math.round("5") работает, тогда как value.round() не будет работать, когда значение представляет собой строку (например, значение текстового поля)
  • Некоторые члены объекта Math не относятся к "первичному" значению числа, например Math.min() или Math.max(). Или вы хотите использовать его как a.max(b)?
  • Другие члены являются глобальными и не принадлежат к специализированному номеру. Примерами являются константы типа Math.PI или функция Math.random().

Ответ 3

Попробуйте выполнить 123.round();

Ваша консоль javascript будет бросать вам несколько сотен ошибок: P, nah...

Вы можете сделать:

Number.prototype.x затем: (123).x();, но никогда 123.x();

Ответ 4

Я думаю, что Math больше, чем множество методов Number. Это более широкое использование. Скажем, используя NumberVariable.PI может быть запутанным. То же самое с генерацией случайных чисел.

Также я думаю, что продление числа в порядке, потому что это часть JS-природы. Может быть, кто-то меня исправит, если я ошибаюсь здесь.

Ответ 5

Я считаю, что его так и работает, поскольку функции прототипа Number работают так же, как и все другие функции прототипа объекта:

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

Ответ 6

Итак, разговор о том, хорошая ли это идея или нет, вы можете сделать это хорошо.

Вы можете сделать 123.x(), но интерпретатор для js сломан (поскольку он не интерпретирует точку как отправку сообщений)

Вряд ли вы можете использовать 123.x() (с пробелом между числом и точкой), и это сработает.

123..также работает, но это потому, что вы эффективно сделали десятичное число, а затем отправили ему

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

Try:

Number.prototype.times = function (other) {return this * other}; 3 × (5);

в консоли.

Ответ 7

Мой взгляд на это заключается в том, что если вы выполняете правильные проверки, чтобы не перезаписывать встроенные функции, назовите их с пониманием стандартных стандартов имен, и это сделает ваш код более читабельным и управляемым, а затем сделает ваш код удобным и удобным.

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

AS для использования этого, из-за характера javascript, я считаю, что лучший способ сделать это:

  • Объединять число в переменной вместо простого статического значения (чаще всего)
    • nNum.round();
  • Обтекание простым статическим значением в круглых скобках:
    • (123).round();
  • Вызов с использованием обозначения квадратной скобки
    • .
    • 123 [ "круглый" ] вызова();