Foro

Herencia en Javascript, dudas sobre un ejemplo que vi.

0
Hola buen día. Voy a pegar un ejemplo que vi en una página y aún tengo dudas del porque de su comportamiento. function Persona(nom, ap1, ap2) { this.nombre = nom; this.apellido1 = ap1; this.apellido2 = ap2; this.nombreCompleto = function () { return this.nombre + " " + this.apellido1 + " " + this.apellido2; }; } Persona.prototype.historia = function (texto) { this.historiaPersonal = texto }; function Hacker(nom, ap1, ap2, proy) { this.superclase = Persona; this.superclase(nom, ap1, ap2); this.proyecto = proy; this.nombreCompletoYProyecto = function() { return this.nombreCompleto() + ": " + this.proyecto; }; } // instanciamos un objeto del tipo hijo: podemos acceder a los métodos definidos en la clase padre var mitnick = new Hacker("Kevin", "Mitnick", null, "Phreacking"); alert(mitnick.nombreCompleto()); alert(mitnick.nombreCompletoYProyecto()); // instanciamos un objeto del tipo padre: podemos acceder a los métodos definidos a través de prototype var yo = new Persona ("Daniel", "Pecos", "Martínez"); yo.historia("Fundé estilohacker.com en 2008..."); alert(yo.historiaPersonal); // error: historia() pertenece al tipo Persona (definido mediante prototype), no a la clase Hacker mitnick.historia("Kevin Mitnick fue encarcelado acusado de ..."); alert(mitnick.historiaPersonal); Según he leído, lo que se pone en el prototype, los objetos que se crean heredan lo que haya ahi, pero en este ejemplo, cuando intento ejecutar mitnick.historia me sale un error, de que el método historia es indefinida. Me podrían explicar o dar referencias sobre el porque de dicho comportamiento? Saludos y gracias
0
Lo que sucede es que en ningún momento la clase Hacker hereda de Persona, por eso el método "historia" es indefinido, porque en ningún lugar estas heredandolo, has de cuenta que tienes dos clases completamente diferentes ;) Para realizar la "herencia" necesitas primero copiar dinámicamente los métodos y propiedades del prototipo de la super clase a la subclase. Checa el siguiente código y me comentas si tienes alguna duda. var Class = { extend : function(super,cls){ var subclass = cls.init || function(){}; this.apply(subclass.prototype,super.prototype); subclass.superclass = super.prototype; return subclass; }, apply : function(dest,src){ for(var key in src){ dest[key] = src[key]; } return dest; } } var Persona = Class.extend(Object,{ init : function(){ }, historial : function(text){ this.historialPersona = text; } }); var Hacker = Class.extend(Persona,{ init : function(){ Hacker.superclass.constructor.call(this); }, metodo : function(){ console.debug("Otro método de hacker"); } }); var kevin = new Hacker(); kevin.historial(); Saludos
0
Hola Crysfel, gracias por la respuesta, si tengo muchas dudas en tu código :P, pero lo analizaré con más detalle. Con respecto a tu comentario de que en ningún momento hago herencia, he estado leyendo que hay dos formas de hacerla, una es usando prototype y la otra como el ejemplo que puse, según la herencia,la hago en la siguiente línea: this.superclase = Persona; que está dentro de la clase Hacker, que esa vendría siendo la segunda manera de crear herencia según las varias páginas que he leído, por eso la duda. La página de donde saqué el ejemplo es: http://danielpecos.com/wiki/Programaci%C3%B3n:_Javascript_Avanzado#Herenciamplo y hay una parte que dice lo siguiente: "Todos los atributos y métodos definido en el tipo padre tienen el mismo nivel de acceso que los definidos en la clase hija, de hecho en Javascript no hay más que un nivel de acceso que podríamos denominar como público. A ésta regla existe una excepción: los atributos y métodos definidos a través de prototype para la clase padre, no son heredados por la clase hija. Ésto es así porque realmente el objeto hijo es del tipo hijo, con la característica de que se le han añadido los atributos y métodos que se habían definido para la clase padre." Tal vez estoy entendiendo mal alguno de los conceptos. Saludos y Gracias

¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook

Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.