miércoles, 10 de septiembre de 2014

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.

No hay comentarios: