Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/08/2011, 03:44
iDeslocK
 
Fecha de Ingreso: agosto-2011
Ubicación: Santiago, Chile
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 2
Pregunta Problema herencia con prototipos

Hola a todos,

Soy nuevo en este foro y espero que me puedan ayudar, así como poder aportar en lo que mas pueda a sus consultas.

Inicio con la siguiente inquietud.

Hace un tiempo ya me metí al mundo de los prototipos ya que necesito manejar una buena performance en mi proyecto, pero creo que me enredé mucho.. o tal vez tengo las típicas lagunas de programador (que a todos nos pasa de vez en cuando) en las que te caes en tonterias XD

Bueno, la pregunta es la siguiente:

Tengo el siguiente código para probar la herencia con prototipos:

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  5. <title>Untitled Document</title>
  6. <script language="javascript">
  7. $(document).ready(function(){
  8. function Maquina(nombre) {
  9.     this.nombre = nombre || "Evil Device";
  10.     this.encendida = false;
  11.     this.power = function() {
  12.                      this.encendida = !this.encendida;
  13.                      alert(this.nombre + " está ahora " + (this.encendida ? "encendido" : "apagado"));
  14.                  };
  15.     this.utilizar = function() {
  16.                         if (this.encendida) alert("Bip! durududu... pip!");
  17.                     };
  18.     this.config = {
  19.         voltaje : 100,
  20.         movimientos : {derecha:"der",izquierda:"izq",arriba:"arr",abajo:"aba"} 
  21.     };
  22. }
  23. Maquina.prototype.cambiaVoltaje = function(volts){
  24.         this.config.voltaje = volts;
  25. }
  26.  
  27. function Robot(nombre) {
  28.     this.nombre = nombre || "Evil Robot";
  29.     this.utilizar = function() {
  30.                         if (this.encendida) alert("Bip! " + this.nombre + " a sus ordenes!");
  31.                     };
  32. }
  33. Robot.prototype = new Maquina();
  34. Robot.prototype.constructor = Robot;
  35.  
  36. function Androide(nombre) {
  37.     this.nombre = nombre || "D.A.R.Y.L.";
  38.     delete this.utilizar; // Los androides son autónomos
  39.  
  40.     this.mandar = function(orden) {
  41.                       if (this.encendida) alert(orden +" es mi misión ahora, jefe!");
  42.                   };
  43.  
  44. }
  45. Androide.prototype = new Robot();
  46. Androide.prototype.constructor = Androide;
  47.  
  48.  
  49. function RobotGigante(nombre) {
  50.     this.nombre = nombre || "Ironman";
  51.    
  52.     this.utilizar = function() {
  53.                         if (this.encendida) alert("Ooops. Creo que he pisado una ciudad!");
  54.                     }
  55. }
  56. RobotGigante.prototype = new Robot();
  57. RobotGigante.prototype.constructor = RobotGigante;
  58.  
  59.  
  60. var paranoid = new Androide("Marvin");
  61. var panel = new Androide("Panel de Control");
  62. var intergalactic = new RobotGigante("Planetary");
  63. panel.cambiaVoltaje(100000000);
  64.  
  65. alert("Androide:" + paranoid.config.voltaje);
  66. alert("Maquina:" + panel.config.voltaje);
  67. alert("RobotGigante(ROBOT):" + intergalactic.config.voltaje);
  68. });
  69. </head>
  70.  
  71. </body>
  72. </html>
  73.  
  74. <!-- si copian y pegan la pagina funcionara en su totalidad //-->
cuando lo ejecuten se darán cuenta de que aunque solo instancia la función cambiaVoltaje para el objeto panel, el voltaje se cambia para todos los objetos creados (sé que si hago el cambio directamente al objeto padre deberia tener ese efecto ej: Maquina.prototype.config.voltaje = 1000000; y asi se aplicaria a todos, pero.... )

¿Por qué esta modificando paranoid e intergalactic ?

Espero me puedan ayudar y la verdad es que tengo el presentimiento de que es una tonteria que no estoy viendo.

de ante mano muchas Gracias

NOTA: el código lo saque del tutorial : http://es.debugmodeon.com/articulo/conociendo-javascript-v-orientacion-a-objetos-2-herencia-la-cadena-de-prototipos

y lo modifique para hacer las pruebas.

Última edición por iDeslocK; 12/08/2011 a las 06:54