Расширяя номер, чтобы получить натуральное число - PullRequest
0 голосов
/ 21 февраля 2019

Я весьма заинтригован после прочтения в Крокфорде JavaScript: хорошие моменты, которые делают это:

Function.prototype.method=function(name, func){
  this.prototype[name] = func;
  return this
}

Я могу расширить число, так что это будет работать:

Number.method('integer',function(){
  return Math.round(this)
});

44.4.integer (); // 44

но при попытке получить положительное целое число (натуральное число) выдает ошибку:

Function.prototype.method=function(name, func){
  this.prototype[name] = func;
  return this
}
Number.method('natural',function(){
  return Math.round(Math.abs(this))
});

   -44.4.natural();// error or doesn't work

есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Когда вы говорите «ошибка», я предполагаю, что вы имеете в виду «неправильный результат».

Проблема в том, что -44.4.natural() эффективно -(44.4.natural()).Если вы посмотрите на this в методе natural, вы увидите, что это 44.4, а не -44.4.

JavaScript не имеет литерального формата отрицательного числа.Вместо этого он использует оператор отрицания.Правила приоритета означают, что сначала выполняется вызов метода, а затем отрицание.

Если вы хотите использовать -44.4 в качестве значения, поместите его в переменную:

let a = -44.4;
console.log(a.natural()); // 44.4

Live Example:

Function.prototype.method=function(name, func){
  this.prototype[name] = func;
  return this
}

Number.method('natural',function(){
  return Math.abs(this)
});

let a = -44.4;
console.log(a.natural());

или используйте ():

console.log((-44.4).natural()); // 44.4

Live Пример:

Function.prototype.method=function(name, func){
  this.prototype[name] = func;
  return this
}

Number.method('natural',function(){
  return Math.abs(this)
});

console.log((-44.4).natural()); // 44.4
0 голосов
/ 21 февраля 2019

Вы можете использовать его следующим образом:

console.log((-44.4).natural());

Ваша проблема в том, что сначала выполняется 44.4.natural (), а затем вы печатаете отрицательный результат.

    Function.prototype.method=function(name, func){
      this.prototype[name] = func;
      return this
    }
    Number.method('natural',function(){
      return Math.round(Math.abs(this))
    });
    
    console.log((-44.4).natural());
...