Каковы подводные камни расширения Object.prototype?

Я хочу расширить Object.prototype, чтобы в основном поддерживать уведомления в данных JSON и элементах html через инфраструктуру пользовательского интерфейса.

Object.prototype.setValue = function(key,value){
   // this simply sets value as this[key] = value
   // and raises an event
   Binder.setValue(this,key,value);
};
Object.prototype.getValue = function(key){
   return Binder.getValue(this,key);
};

Однако, основываясь на этом вопросе, Extending Object.prototype JavaScript и некоторых других, люди говорят, что мы следует избегать расширения Object.prototype, вместо этого подойдет любой другой тип.

Если я этого не сделаю, то мой код станет больше, например

window.myModel.setValue("currentStatus","empty");

нужно будет написать так,

Binder.setValue(window.myModel,"currentStatus","empty");

Я хочу знать, что пойдет не так, если я воспользуюсь этими методами? приведет ли это к неожиданному поведению jQuery? Однажды я видел, что ajax-запрос jQuery также вызывает методы прототипа (поскольку они ссылаются на функции для обработки событий).

Каковы другие побочные эффекты этого? Я знаю, что это не работает для (var x в obj), но в основном мы можем использовать obj.hasOwnProperty, это должно помочь, верно?


person Akash Kava    schedule 01.12.2011    source источник


Ответы (2)


Вы просто не хотите возиться с прототипами из хост-объектов или нативных объектов.

  • Вы не можете знать, какие побочные эффекты он оказывает на любой сторонний скрипт.
  • Вы можете перепутать сторонний код
  • Вы не знаете, будут ли когда-нибудь эти методы созданы изначально

в целом расширение Object.prototype влияет на любой другой объект на всем сайте. Опять же, вы просто не хотите этого делать, если только вы не находитесь в такой изолированной среде, и каждый отдельный фрагмент ecmascript написан самостоятельно, и вы на 100% уверены, что никакой сторонний скрипт никогда не загружается.

person jAndy    schedule 01.12.2011

Я знаю, что это не работает for(var x in obj), но в основном мы можем использовать obj.hasOwnProperty, это должно помочь, верно?

Это единственная серьезная ловушка, и .hasOwnProperty() помогает, но только в вашем собственном коде. Например, в jQuery они приняли преднамеренное решение не вызывать .hasOwnProperty в методе $.each().

Я использовал Object.defineProperty(...) в своем собственном коде, чтобы обойти проблему перечислимых свойств без вредных последствий (хотя и на Array.prototype)

person Alnitak    schedule 01.12.2011
comment
Почему автор jQuery принял решение не вызывать .hasOwnProperty по какой-то конкретной причине? Он обязательно пытается вызвать мои обработчики событий и уведомляет об изменениях, однако я нашел обходной путь, проверив аргументы. - person Akash Kava; 01.12.2011