Каковы преимущества и опасности добавления методов в Object.prototype в Javascript?

Я знаю, что это был спорный вопрос, пять лет назад, но мне интересно, если что-то изменилось на сегодняшний JavaScript. Существуют ли реальные примеры того, как большая современная библиотека несовместима с расширениемObject.prototype?

Я не заинтересован в гипотетическом "кто-то может написать плохоfor in код итерации в библиотеке, которую вы хотите использовать, возможно, в будущем, и тогда вы можете получить странную ошибку "

 Marcel Korpel30 сент. 2010 г., 19:21
Есть хорошая дискуссия об этом наObject.prototype является ошибкой

Ответы на вопрос(1)

Решение Вопроса

как большая современная библиотека несовместима с расширением Object.prototype?

Да, я помню проблемы с JQuery, который является одним изменее навязчивый библиотеки - например:

Я попытался создать прототип метода length () для Object и сломал jQuery - как?

Другой случай, который я помню, это то, что кто-то добавилload функция кObject.prototype объект, и это вызвало проблемы с$().load событие:

// DON'T DO THIS ! :)
Object.prototype.load = function () {};

​$(window).load(function () {
  alert('load event'); // never fired
});​

примерВот.

УвеличиваяObject.prototype объект таким способом никогда не рекомендуется, потому что эти свойства будут наследоваться большим количеством объектов - даже некоторыми объектами хоста - и, как вы знаете, основная проблема заключается в том, что они будут перечисленыfor-in заявление.

В ECMAScript 5 теперь существует более безопасный способ, потому что теперь мы можем объявлять не перечисляемые свойства, например:

Object.defineProperty(Object.prototype, 'foo', { value: 'bar' });

В дескрипторе свойства -{ value: 'bar' }- мы можем указать атрибуты свойства, в случаеЗначение свойства как в приведенном выше примере, мы можем указатьwritable атрибут и общееconfigurable Атрибут (определяет, может ли свойство быть переконфигурировано - изменения атрибута - или удалены.

И у нас есть такжеenumerable атрибут, который определяет, будет ли свойство перечисленоfor-in заявление.

Если мы не указываем атрибуты, ониfalse по умолчанию дескриптор будет выглядеть так:

{
  value: 'bar',
  writable: false,
  configurable: false,
  enumerable: false
}
 NoobishPro17 апр. 2018 г., 05:32
Тааак для дополнительной информации; Я поместил 2 расширения в прототип объекта (forEach и getLength), и это нарушает большинство сценариев Google.
 Daniel X Moore12 окт. 2010 г., 05:32
Спасибо за информацию о том, что jQuery работает некорректно во всех случаях, когда Object.prototype расширен. Я читал, что они планируют заставить его взаимодействовать в определенный момент в будущем. Я предполагаю, что пока еще слишком рано расширять Object.prototype без очень тщательного рассмотрения.

Ваш ответ на вопрос