quinta-feira, 3 de março de 2011

Classes + Herança = JavaScript OO

var classe = (function() {
 var classe = function(superclass, overrides) {
  // trata a passagem de apenas um argumento.
  if (!overrides) {
   overrides = superclass;
   superclass = Object;
  }
  // se o construtor nao foi injetado, cria um com chamada para a
  // superclass.
  var constructor = (
   overrides.constructor != Object
   ? overrides.constructor
   : function(){superclass.apply(this, arguments);}
  );
  // funcao que possibilita a herança.
  var inheritance = function(over) {
   if (typeof this == 'function') {
    // herança direta.
    return classe(this, over);
   } else {
    // override sobre as classes.
    for ( var k in over) {
     this[k] = over[k];
    }
   }
  };
  // muda a referencia do prototipo para fazer a herança.
  inheritance.prototype = superclass.prototype;
  // clona o prototipo da superclasse, sem a execucao do construtor da
  // mesma.
  constructor.prototype = new inheritance(overrides);
  // aponta a referencia do construtor para a classe.
  constructor.prototype.constructor = constructor;
  // adiciona acesso a superclass!
  constructor.superclass = superclass.prototype;
  // adiciona o metodo auxiliar para herança direta.
  constructor.extend = inheritance;
  // retorna a classe!
  return constructor;
 };
 return classe;
})();