Javascript herencia con factoría de objetos


Javascript no tiene un soporte claro para la herencia. Tal vez sea debido a que no existe el concepto de clase. En los lenguajes tradicionales, solemos definir la clase como una plantilla de cómo debe ser el objeto y después instanciamos a partir de esa definición.

Además, en Javascript todo es un objeto dinámico. En cualquier momento podemos añadir, quitar o cambiar cualquier propiedad de un objeto sin preocuparnos de la pertenencia a una clase o la necesidad de convertir entre clases.

Si lo que deseamos es la funcionalidad que nos otorga la herencia y preferimos el estilo de construcción de factoría de objetos, es decir, un objeto Function que nos retorna otro objeto con sus propiedades es muy fácil implementar la herencia y la sobreeescritura.

Pongo un ejemplo que se explica por si mismo:

"use strict";

// el objeto base
var Familia=function(fam) {
var obj={};
obj.familia=fam;

// Function en el objeto base
obj.tienePatas=function() {
return (obj.familia==="Hominidae")? true: false;
};

// sobreescritura de Object.toString()
obj.toString=function() {
console.log("FAMILIA ============");
console.log("Familia:", obj.familia);
};

return obj;
};

// objeto que hereda
var Genero=function(fam, gen) {

// obj es una Familia
// "heredamos" en Genero sus propiedades...
var obj=Familia(fam);

// ... y añadimos una propiedad nueva
obj.genero=gen;

// sobreescribimos (otra vez) toString
obj.toString=function() {
console.log("FAMILIA Y GENERO ============");
console.log("Familia:", obj.familia, "Genero:", obj.genero);
};

return obj;
};

// creamos nuevo objeto Familia
var monos=Familia("Hominidae");
monos.toString(); // Hominidae
console.log(monos.tienePatas()); // true

// creamos nuevo objeto Genero
var hombre=Genero("Hominidae", "Homo");
hombre.toString(); // Hominidae Homo
console.log(hombre.tienePatas()); // true

Este método es muy fácil y cómodo pero si tenemos que crear grandes cantidades de objetos es preferible usar prototype ya que ahorra gran cantidad de espacio en memoria.

Written with StackEdit.