Модификация встроенных прототипов объектов в целом является плохой идеей, поскольку она всегда может конфликтовать с другим кодом на той же странице.
В случае прототипа объекта Array это особенно плохая идея, поскольку она потенциально может создавать помехи любому фрагменту кода, который перебирает элементы любого массива, например, с for .. in
.
Для иллюстрации на примере (заимствовано из здесь ):
Array.prototype.foo = 1;
// somewhere deep in other javascript code...
var a = [1,2,3,4,5];
for (x in a){
// Now foo is a part of EVERY array and
// will show up here as a value of 'x'
}
Обратное верно: вам следует избегать for..in, если некоторые n00b изменили прототип Array, и вам следует избегать изменения прототипа Array в случае, если некоторые n00b использовали for..in для массива.
Было бы лучше, если бы вы создавали собственный тип конструктора объектов с функцией doSomething, а не расширяли встроенный массив.
А как насчет Object.defineProperty
?
В настоящее время существует Object.defineProperty
как общий способ расширения прототипов объектов без перечисления новых свойств, хотя я все еще не буду использовать это как оправдание для расширения встроенных типов , потому что даже кроме for..in
все еще существует вероятность других конфликтов с другими сценариями. Представьте себе кого-то, использующего две платформы Javascript, которые пытаются аналогичным образом расширить массив и выбрать одно и то же имя метода. Или представьте, что кто-то разветвляет ваш код, а затем помещает как оригинальную, так и разветвленную версии на одну страницу. Будут ли работать пользовательские улучшения объекта Array?
Это реальность с Javascript, и почему вы должны избегать модификации прототипов встроенных типов, даже с Object.defineProperty
. Определите свои собственные типы с вашими собственными конструкторами.