Ver Mensaje Individual
  #20 (permalink)  
Antiguo 04/03/2010, 08:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

Si hacés eso, el programa da error porque "this.prototype" no está definido, y por lo tanto no podés agregarle una propiedad.
Modificándolo como lo hice abajo, un objeto creado via "new net.CargadorContenidos()" no podrá llamar a metodo1 o metodo2

No tengo claro el motivo, pero tiene que ver con que el "this" se refiere al objeto nuevo, no a "n", en el ámbito en el que lo declarás. Por lo que resulta que estás modificando el "prototype" del objeto nuevo, no de n. De pasada, al modificar el prototype de esta forma, hacés que el objeto nuevo no se vincule a n, y que cada objeto creado tenga su propio prototype (aunque con las mismas propiedades) y por lo tanto la herencia se rompa. Ya no podrás aumentar "n" y que el cambio se refleje en todos sus hijos. Tengo que investigar más al respecto.

Si te fijás, el siguiente código da error. He cambiado un poco los nombres para escribirlo un poco más rápido, pero en el resto es igual. Si dejás la llamada a a.metodo1(), el programa falla en ese paso. Si la borras, la salida es
Código:
a tiene req
a tiene prototype
a.prototype tiene metodo1
a.prototype tiene metodo2
Código Javascript:
Ver original
  1. <div id="coso">
  2. <script>
  3. c = document.getElementById("coso");
  4.  
  5. n = function () {
  6.     this.req = 1;
  7.     this.prototype = {
  8.         metodo1 : function () { alert("metodo1") },
  9.         metodo2 : function () { alert("metodo2"); },
  10.     }
  11. }
  12.  
  13. a = new n()
  14. for (i in a) {
  15.     c.innerHTML += "a tiene " + i + "<br/>";
  16. }
  17.  
  18. //alert("llamando a.metodo1 y a.metodo2");
  19. //a.metodo1();
  20. //a.metodo2();
  21.  
  22. for (i in a.prototype) {
  23.     c.innerHTML += "a.prototype tiene " + i+ "<br/>";
  24. }
  25.  
  26.  
  27. for (i in n) {
  28.     c.innerHTML += "n tiene " + i + "<br/>";
  29. }
  30.  
  31. </script>

En cambio, si dejás la modificación a "n" en una declaración diferente:
Código Javascript:
Ver original
  1. n = function () {
  2.     this.req = 1;
  3. }
  4.  
  5. n.prototype = {
  6.         metodo1 : function () { alert("metodo1") },
  7.         metodo2 : function () { alert("metodo2"); },
  8. }
la salida es
Código:
a tiene req
a tiene metodo1
a tiene metodo2