Как программисты, один из навыков, которому мы должны научиться в первую очередь, – это поиск решения.
Google – ваш друг. И в большинстве случаев ответ StackOverflow 2009 года является идеальным решением вашей проблемы 2019+.
На этом конкретном сайте или в личных блогах я иногда вижу код, который изменяет прототипы встроенных объектов.
Как в этом примере, где прототип объекта массива улучшен путем добавления метода вставить :
Array.prototype.insert = function(index, item) {
this.splice(index, 0, item)
}Таким образом, вы можете создать массив и вызвать функцию insert() для него:
['red', 'blue'].insert(0, 'yellow')
Это удобно. Вместо того чтобы определять такую функцию и беспокоиться о ее области применения, вы прикрепляете ее к объекту массива, чтобы она была доступна в каждом массиве.
Но только потому, что вы можете , это не значит, что вы должны .
Что плохого в таком подходе?
Возможные конфликты
Предположим, что библиотека, которую вы используете, реализует такую вещь. И другая библиотека, которую вы импортируете, делает то же самое. Возможно, методы работают немного по-другому, и кажется, что все работает нормально, пока этого не произойдет.
Здесь у вас большая проблема, потому что вы не можете изменять эти библиотеки, но вы все равно хотите их использовать.
Защита вашего кода на будущее
Предположим, что в следующей версии JavaScript реализован метод Array.insert . С другой подписью. Знаете, что происходит? Вам нужно вернуться и переписать весь код, который вы написали. Возможно, для клиента, на которого вы больше не работаете.
Или, может быть, вы сделали это в библиотеке, которая используется другими людьми в их собственных проектах. Это было бы еще хуже.
Такой подход только создает техническую задолженность и в значительной степени создает проблемы.
Что вам следует сделать вместо этого?
Создайте функцию в файле библиотеки и импортируйте ее, когда захотите ее использовать. Не изменяйте объекты, над которыми вы не имеете никакого контроля.
Оригинал: “https://flaviocopes.com/javascript-why-not-modify-object-prototype/”