как вы можете создать прототип в Integer?
Integer.prototype.num = function(dec){
return number_format(this.toString(), dec);
}
как вы можете создать прототип в Integer?
Integer.prototype.num = function(dec){
return number_format(this.toString(), dec);
}
В JavaScript нет Integer
, просто Number
. Вы можете расширить Number
так, как вы показали.
Существует два лагеря для расширения встроенных типов. Один лагерь говорит, что это зло, и вы не должны этого делать; используйте отдельную функцию, в которую вы передаете объект. В другом лагере говорится, что именно поэтому у нас есть прототипы, поэтому мы можем расширить функциональность вещей по своему усмотрению.
Если вы находитесь во втором лагере, есть недостатки, которые следует избегать (но см. "Мир меняется..." ниже):
Object.prototype
таким образом. Вы нарушите огромное количество кода.Array.prototype
, вы нарушите справедливый бит кода.Причина в обоих случаях заключается в том, что при расширении прототипа таким образом вы создаете перечислимое свойство прототипа. Это означает, что он отображается в циклах for..in
. Пользовательский и практический опыт в мире JavaScript заключается в том, что должен не быть перечисляемым свойствам на пустом объекте ({}
). Массивы могут быть более приемлемыми, но будьте осторожны с людьми, которые на самом деле не понимают что for..in
делает, которые думают, что он будет проходить через индексы массива; если вы растянете Array.prototype
таким образом, вы сломаете их петли. (Я бы сказал, что их петли уже сломаны, но оставьте это в стороне...)
Object.defineProperty
:
Object.defineProperty(Number.prototype, "num", {
enumerable: false,
value: function() { ... }
});
Обратите внимание, что enumerable: false
(false
является значением по умолчанию для enumerable
, я здесь явно для акцента). Это означает, что он не отображается в цикле for..in
и поэтому смягчает этот аргумент против распространения прототипов собственных объектов.
Тем не менее, возможность конфликтов имен (с другим кодом, распространяющим прототип или функции, добавленные в будущих версиях JavaScript), сохраняется даже при Object.defineProperty
.
Javascript не имеет интегральных типов (Integer
). Только числа с плавающей запятой (попробуйте typeof 3
. Возвращает Number
).
Итак, вы можете использовать что-то вроде:
Number.prototype.myfunc = function() { }
Как отметил в комментарии Феликс Клинг, расширение Javascript, созданного в объектах с использованием свойства .prototype
, обычно не очень хорошая идея. Новое расширение применяется автоматически ко всем объектам этого типа, включая те, которые уже созданы, и имена, которые будут созданы кодом, отличным от вашего. Таким образом, это может помешать тому, что ожидает какой-либо другой код для объекта Number.
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