Per estendere gli elementi HTML il modo migliore sarebbe manipolare l'HTML.prototype, ma visto che in IE tale metodo non funziona il team di prototype si è 'inventato' un modo per scavalcare il problema;
andando molto per la sintesi il metodo utilizzato è simile a questo:
codice:
function $(id) {
  var el = document.getElementById(id);
  for(var i in $.methods) {
    if(typeof($.methods[i]) == 'function')
      el[i] = $.methods[i];
  }
}

$.methods = {
  'test': function() {
    alert(this.tagName);
  }
}
In questo modo tutti i metodi di $.methods vengono aggiunti a tutti gli oggetti chiamati con $.
L'approccio usato da prototype è però uno dei più invasivi; personalmente preferisco un approccio alla jquery:
codice:
function $(id) {
  return new $.klass(document.getElementById(id));
}

$.klass = function(el) {
  this.el = el;
}

$.class.prototype = {
  'test': function() {
    alert(this.tagName);
  }
}
Tra l'altro quest'ultimo approcio permette con qualche opportuna modifica di manipolare anche più elementi html in una volta.