9

I know this was a contentious issue five years ago, but I'm wondering if things have changed for today's JavaScript. Are there any real world examples of a major modern library being incompatible with extending Object.prototype?

I'm not interested in hypothetical "someone may write bad for in iteration code in a library that you want to use, maybe, in the future, and then you might get a weird bug"

Daniel X Moore
  • 14,637
  • 17
  • 80
  • 92
  • 1
    There's a nice discussion about this on [Object.prototype is erlaubt](http://www.thomasfrank.se/object_prototype_is_erlaubt.html) – Marcel Korpel Sep 30 '10 at 17:21

1 Answers1

13

Are there any real world examples of a major modern library being incompatible with extending Object.prototype?

Yes, I remember problems with jQuery, -which is one of the less intrusive libraries- for example:

Another case that I remember is that someone added a load function to the Object.prototype object, and it caused problems with the $().load event:

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

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

Example here.

Augmenting the Object.prototype object in that way is never recommended, because those properties will be inherited by a great number of objects -even also by some host objects-, and as you know, the primary concern is that they will be enumerated by the for-in statement.

In ECMAScript 5, now a safer way exist, because we can now declare non-enumerable properties, for example:

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

In the property descriptor -{ value: 'bar' }- we can specify property attributes, in the case of Value Properties as in the above example, we can specify the writable attribute, and the common configurable attribute (determines if a property can be re-configured -attribute changes- or deleted.

And we have also the enumerable attribute, which determines if the property will be enumerated by the for-in statement.

If we don't specify the attributes, they are false by default, the descriptor will look like:

{
  value: 'bar',
  writable: false,
  configurable: false,
  enumerable: false
}
Community
  • 1
  • 1
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
  • Thanks for the info about jQuery not working correctly in all cases when Object.prototype is extended. I have read that they are planning to get it to interact nicely at some point in the future. I suppose that for now it's still too early to be extending Object.prototype without very careful consideration. – Daniel X Moore Oct 12 '10 at 03:32
  • Soooo for extra info; I put 2 extensions within the object prototype (forEach and getLength) and it breaks most of google's scripts. – NoobishPro Apr 17 '18 at 03:32