Ответ 1
В 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
.