Herencia
En JavaScript también existe este concepto, con la ayuda de lo que hemos visto en el post anterior, los prototypes, para resumir un poco lo que hacemos es llamar al "padre" del cual queramos heredar(como si llamaramos a super en otros lenguajes) y le decimos que cambie su this(su contexto o instancia) por el nuestro junto con los parámetros que necesitemos.
Creo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos un constructor y luego extenderemos de él.
function Superhero(alias) {
this.alias = alias;
this.getInfo = function () {
console.log('Nuestro héroe se llama ' + this.alias);
}
}
Este sería nuestro constructor, vamos a crear un elemento para ver que funciona
var mr_manhattan = new Superhero('Dr. Manhattan');
mr_manhattan.getInfo();
Si ejecutamos esto(recordar con node nombreFicheroJS), veríamos que funciona
Ahora vamos a crear otra función que herede de la primera, para ello nos valemos del método que tienen todas las funciones call
function Hero(alias){
Superhero.call(this, alias);
}
Como véis le pasamos el this de nuestro método y le pasamos el parámetro de la función superhero.
Por último añadimos a los prototipos de la función Hero, un nuevo Superhero para que realmente lo herede, y tras esto ya podriamos usar Hero con las propiedades de Superhero
Hero.prototype = new Superhero('Walter Joseph Kovacs');
var rorschach = new Hero('Rorschach');
rorschach.getInfo();
console.log(Object.getPrototypeOf(rorschach))
console.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))
console.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))
Nuestro rorschach puede usar los mismos métodos que Superhero, y para comprobarlo he vuesto unos cuantos logs que nos mostrarían cuales son los prototypes que tiene, y si es una instancia de cada uno de nuestros constructores
Herencia Múltiple
Podemos simular herencia múltiple aprovechando lo que acabamos de hacer y usando el método assign, este método lo que hace es copiar las propiedades de un objeto en otro, con lo que el objeto destino puede usarlas como si fueran suyas. Veámoslo con un ejemplo continuando con lo anterior.
Lo primero vamos a crear otro constructor, en este caso SuperPowers()
function SuperPowers(){
this.superStrength = function(){
console.log( this.alias + ' tiene super fuerza')
}
this.superSpeed = function(){
console.log( this.alias + ' tiene super velocidad')
}
}
Y a continuación lo que haremos será "asignarle" estas propiedades a nuestro rorschach
Object.assign(rorschach, new SuperPowers());
Simplemente tenemos que usar el método assign de Object y como parámetros le pasamos la instancia del objeto destino y una instancia del objeto origen, en este caso con new SuperPowers()
Ahora simplemente podemos comprobar que realmente nuestro rorschach tiene las propiedades de SuperPowers
rorschach.superStrength();
rorschach.superSpeed();
Además le añadiremos lo mismo que antes para comprobar si es una instancia de SuperPowers, quedando así todo el código
//Herencia
function Superhero(alias) {
this.alias = alias;
this.getInfo = function () {
console.log('Nuestro héroe se llama ' + this.alias);
}
}
var mr_manhattan = new Superhero('Dr. Manhattan');
mr_manhattan.getInfo();
//Herencia de superhero
function Hero(alias){
Superhero.call(this, alias);
}
Hero.prototype = new Superhero('Walter Joseph Kovacs');
var rorschach = new Hero('Rorschach');
rorschach.getInfo();
console.log(Object.getPrototypeOf(rorschach))
console.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))
console.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))
//Herencia Múltiple
function SuperPowers(){
this.superStrength = function(){
console.log( this.alias + ' tiene super fuerza')
}
this.superSpeed = function(){
console.log( this.alias + ' tiene super velocidad')
}
}
Object.assign(rorschach, new SuperPowers());
rorschach.superStrength();
rorschach.superSpeed();
console.log('Es una instancia de SuperPowers? ' + (rorschach instanceof SuperPowers));
Lo que nos daría este resultado
Anda!!! Hay algo distinto verdad?? Nos dice que no es una instancia de SuperPowers...pero ¿por qué?.. Bueno en este caso es bastante simple, realmente lo que hacemos es una copia de propiedades de un elemento a otro, es decir, sería como si el constructor de nuestro rorschach hubiera tenido las mismas propiedades que SuperPowers.
Y hasta aquí el repaso de algunos elementos de JavasScript, a partir del próximo post ya empezaremos a ver NodeJS (Por fiiiiiin!!!! ;) )
Nos vemoooossssss, un abrazooooooorrrr



