title: Why is extending native objects a bad practice?
body: <p>Every JS opinion leader says that extending the native objects is a bad practice. But why? Do we get a perfomance hit? Do they fear that somebody does it "the wrong way", and adds enumerable types to <code>Object</code>, practically destroying all loops on any object?</p>
  
  <p>Take <a href="https://github.com/visionmedia" rel="noreferrer">TJ Holowaychuk</a>'s <a href="https://github.com/visionmedia/should.js" rel="noreferrer">should.js</a> for example. He <a href="https://github.com/visionmedia/should.js#omg-it-extends-object" rel="noreferrer">adds a simple getter</a> to <code>Object</code> and everything works fine (<a href="https://github.com/visionmedia/should.js/blob/master/lib/should.js#L66-78" rel="noreferrer">source</a>).</p>
  
  <pre><code>Object.defineProperty(Object.prototype, 'should', {
    set: function(){},
    get: function(){
      return new Assertion(Object(this).valueOf());
    },
    configurable: true
  });
  </code></pre>
  
  <p>This really makes sense. For instance one could extend <code>Array</code>.</p>
  
  <pre><code>Array.defineProperty(Array.prototype, "remove", {
    set: function(){},
    get: function(){
      return removeArrayElement.bind(this);
    }
  });
  var arr = [0, 1, 2, 3, 4];
  arr.remove(3);
  </code></pre>
  
  <p>Are there any arguments against extending native types?</p>