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

Целый прототип

как вы можете создать прототип в Integer?

Integer.prototype.num = function(dec){
    return number_format(this.toString(), dec);
}
4b9b3361

Ответ 1

В JavaScript нет Integer, просто Number. Вы можете расширить Number так, как вы показали.

Существует два лагеря для расширения встроенных типов. Один лагерь говорит, что это зло, и вы не должны этого делать; используйте отдельную функцию, в которую вы передаете объект. В другом лагере говорится, что именно поэтому у нас есть прототипы, поэтому мы можем расширить функциональность вещей по своему усмотрению.

Если вы находитесь во втором лагере, есть недостатки, которые следует избегать (но см. "Мир меняется..." ниже):

  • Никогда, никогда, никогда не расширяйте Object.prototype таким образом. Вы нарушите огромное количество кода.
  • Будьте очень осторожны с расширением Array.prototype, вы нарушите справедливый бит кода.

Причина в обоих случаях заключается в том, что при расширении прототипа таким образом вы создаете перечислимое свойство прототипа. Это означает, что он отображается в циклах for..in. Пользовательский и практический опыт в мире JavaScript заключается в том, что должен не быть перечисляемым свойствам на пустом объекте ({}). Массивы могут быть более приемлемыми, но будьте осторожны с людьми, которые на самом деле не понимают что for..in делает, которые думают, что он будет проходить через индексы массива; если вы растянете Array.prototype таким образом, вы сломаете их петли. (Я бы сказал, что их петли уже сломаны, но оставьте это в стороне...)

Тем не менее, мир меняется, потому что ECMAScript5 дал нам способ добавить неперечислимые свойства к объектам, и все неопределенно, современные браузеры реализуют его. Он назывался Object.defineProperty:
Object.defineProperty(Number.prototype, "num", {
    enumerable: false,
    value: function() { ... }
});

Обратите внимание, что enumerable: false (false является значением по умолчанию для enumerable, я здесь явно для акцента). Это означает, что он не отображается в цикле for..in и поэтому смягчает этот аргумент против распространения прототипов собственных объектов.

Тем не менее, возможность конфликтов имен (с другим кодом, распространяющим прототип или функции, добавленные в будущих версиях JavaScript), сохраняется даже при Object.defineProperty.

Ответ 2

Javascript не имеет интегральных типов (Integer). Только числа с плавающей запятой (попробуйте typeof 3. Возвращает Number).

Итак, вы можете использовать что-то вроде:

Number.prototype.myfunc = function() { }

Добавление

Как отметил в комментарии Феликс Клинг, расширение Javascript, созданного в объектах с использованием свойства .prototype, обычно не очень хорошая идея. Новое расширение применяется автоматически ко всем объектам этого типа, включая те, которые уже созданы, и имена, которые будут созданы кодом, отличным от вашего. Таким образом, это может помешать тому, что ожидает какой-либо другой код для объекта Number.

Ответ 3

Integer не является собственным javascript-объектом. Может быть, вы хотите добавить метод форматирования к прототипу Number? Например:

var formatNum = function(format){
   return format === 'dec2'
           ? this.toPrecision(String(this).length+2)
           : format === 'div10'
           ? Number(this/10).toPrecision(2)
           : this;
}
Number.prototype.format = formatNum;
var num = 22;
num.format('dec2'); //=> 22.00
num.format('div10'); //=> 2.2