Я думаю, что главная опасность состоит в том, что несколько сторон могут отвергать прототипные методы друг друга, что приводит к неожиданному поведению.
Это особенно опасно , потому что очень многие программисты в восторге от "наследования" прототипа (я бы назвал это расширение ) и поэтому начали использовать его повсеместно, добавляя методы влево и вправо, которые могут иметь неоднозначное или субъективное поведение. В конечном итоге, если этот флажок не будет проверен, этот вид «распространения метода-прототипа» может привести к очень сложному в обслуживании коду.
Популярный пример - метод trim
. Это может быть реализовано примерно так одной стороной:
String.prototype.trim = function() {
// remove all ' ' characters from left & right
}
Тогда другая сторона могла бы создать новое определение с совершенно другой подписью , приняв аргумент, который указывает символ для обрезки. Внезапно весь код, который ничего не передает trim
, не действует.
Или другая сторона переопределяет метод для удаления ' '
символов и других форм пробела (например, табуляции, разрывов строк). Это может остаться незамеченным в течение некоторого времени, но привести к странному поведению в будущем.
В зависимости от проекта, они могут рассматриваться как отдаленные опасности. Но они могут произойти, и, насколько я понимаю, именно поэтому библиотеки, такие как Underscore.js , предпочитают хранить все свои методы в пространствах имен, а не добавлять методы-прототипы.
( Обновление : Очевидно, что это вызов для суждения. Другие библиотеки, а именно, метко названный Prototype - do иди по прототипу. Я не пытаюсь сказать, что один путь правильный или неправильный, только то, что я слышал аргумент против использования методов-прототипов слишком свободно.)