entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problema con herencia en javascript

Hola amigos, tengo un problema con herencia en javascript y quisiera que por favor me ayuden a dar solución, les explico.
Tengo 3 clases: Animal(padre), Gato(hijo), Aux.

//clase Aux
var Aux = function(p1){
    this.parametro1 = p1;
    console.log(p1);
}
Aux.prototype.constructor = Aux;

//clase Animal
var Animal = function(nombre, peso){
    this.nombre = nombre;
    this.peso = peso;
    this.aux = new Aux('parametro1');

}
Animal.prototype.constructor = Animal;

//clase Gato
var Gato = function(nombre, peso){
    Animal.call(this, nombre, peso);
    this.aux = new Aux("parametro2");
}
Gato.prototype = Object.create(Animal.prototype);
Gato.prototype.constructor = Gato.prototype.constructor = Gato;

Ahora creo el objeto gato:

var gato = new Gato("michifu", 9);

y en la consola veo que se imprime los 2 parametros pasados a la clase Aux, por lo tanto se creo 2 objetos tipo Aux y ese es mi problema, ya que consume doble espacio en memoria etc.:

parametro1         
parametro2        

si yo realizo las mismas clases en PHP u otro, el resultado es distinto ya que solo imprime o instancia una sola vez la clase Aux en la clase Gato(hijo) y no asi en la clase Animal(padre).
Bueno amigos solicito su ayuda.!! ya que es un gran problema para mí puesto que estoy realizando un juego en javascript y debo simular un comportamiento de herencia aceptable donde cada detalle cuenta para la velocidad e instanciar 2 veces seria un terrible dolor de cabeza.

Nota. estas 3 clases no son de mi juego, solo quise simplificar por completo y mostrar el comportamiento de 3 clases simples y saber si existe alguna solución.

1voto

christian_avalos comentado

Lograste resolverlo? En Javascript no se puede crear una jerarquía de clases como se hace en otros lenguajes

0voto

wroque comentado

Era misifú xD, No soy experto en javascript, pero veo que tu mismo instancias dos veces el objeto Aux "Animal, Gato", yo dejaría el objeto Animal algo así

var Animal = function(nombre, peso){
    ..
    this.aux = null;
}

var Gato = function(nombre, peso){
    Animal.call(this, nombre, peso);
    this.aux = new Aux("parametro2");
}

depende de lo que necesites, si Aux se va instanciar solo una vez.

puedes dejar

if (this.aux == null) {
   ...
}

etc ..

pero es tu error.

0voto

dimcraft comentado

Amigo christian_avalos creo que fuiste el único que lo entendió.
Tienes razon la jerarquía de clases siempre sera distinta con prototipos, pero ya encontré la solución a mi problema en el framework (phaser) que estoy utilizando, gracias por responder y entender el problema.

2 Respuestas

1voto

Leonardo-Tadei Puntos227020

Hola @dimcraft ,

Si el código PHP te muestra algo distinto del código en JavaScript, entonces tenés un problema de implemetación en PHP...

Tenés que recordar que la herencia siempre es completa, es dicir, una subclase siempre tiene todo lo que su superclase tiene, más las cosas que ella misma implemente.

En este caso, la clase Animal tiene nombre, peso y aux (3 elementos). Cuando creás la clase Gato, esta tiene que tener por herencia los mismos 3 elementos, más los propios, que en este caso es otro aux, con lo que la subclase tiene que terminar teniendo 4 elementos (los 3 heredados + 1 definido ahí) y por tanto lo que obtenés en la consola de JavaScript es correcto.

De hecho, no encuentro qué sentido tiene volver a declarar aux en Gato, cuando ya lo tiene por herencia... parece un error de concepto además del tema de implementación.

Tal vez si nos mostraras el código equivalente PHP, podríamos ver en dónde está tu confusión. Lo más probable es que sea una cuestión de visibilidad (que JavaScript no maneja) y te parezca que el aux de Animal no está en Gato, cuando posiblmente sea accesible desde Gato vía $parent o algo así.

Saludos cordiales!

1voto

jonatancastro1 Puntos3110

No soy un experto en javascript pero al probar tu código me funciona bien.
agregue esta linea al final:

console.log(gato.aux);

y me retorno
{ parametro1: 'parametro2' }

y si dejo la función Gato así:

//clase Gato
var Gato = function(nombre, peso){
    Animal.call(this, nombre, peso);
}

al hacer la misma impresión me retorno:
{ parametro1: 'parametro1' }

por lo que hace referencia a la misma variable, lo que pasa es que vez la impresión 2 veces. la primer al llamar Animal.call(this, nombre, peso); y la segunda al llamar a la función de nuevo this.aux = new Aux("parametro2");

1voto

wroque comentado

lo que pasa es que vez la impresión 2 veces

sera bizco...

A mi también me preocupa la memoria, sobre todo cuando trabajaba en java. esto me remota a mis días de estudiante, cuando debía solo dibujar en un papel los diagramas de clase, y recuerdo que habían tipos de asociación navegabildad, agregación y composición.

Bueno esto es complejo a medida que vas empezando a desarrollar, pero luego se vuelve una tarea sencilla, debes definir el comportamiento de tus objetos como de sus relaciones.

public class Sala {
   private List<Estudiante> estudiantes;

   public Sala () {
       estudiantes = new ArrayList<Estudiante>();
   } 
}

no es lo mismo.

public class Sala {
   private List<Estudiante> estudiantes;

   public Sala (List<Estudiante> estudiantes) {
       this.estudiantes = estudiantes;
   }
}

luego viene lo divertido patrones de diseño, también hay algunos aplicables en javascript :D

0voto

dimcraft comentado

amigo wroque gracias por responder, aunque creo que no comprendiste el problema :), si tengo conocimiento sobre patrones de diseño, pero ya comprendí que la manera de crear jerarquía de clases en javascript(orientado a prototipos), siempre sera distinta a una basada en clases, ya que en javascript no éxiste clases sino mas bien todo es un objeto.
Te sugiero probar el código de ejemplo en java o php y comprenderas la diferencia.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta