Foros del Web » Programando para Internet » Javascript »

Constructores, y el uso del THIS

Estas en el tema de Constructores, y el uso del THIS en el foro de Javascript en Foros del Web. Estoy siguiendo un manual de AJAX y es que me han surgido muchas dudas al llegar a la parte mas importante en donde se comienza ...
  #1 (permalink)  
Antiguo 02/03/2010, 17:32
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Constructores, y el uso del THIS

Estoy siguiendo un manual de AJAX y es que me han surgido muchas dudas al llegar a la parte mas importante en donde se comienza a trabajar de lleno con AJAX. Aunque en si las dudas que tengo son mas relacionadas al Javascript por eso cree el tema aca.

Esta es la web: [URL="http://www.librosweb.es/ajax/capitulo7/utilidades_y_objetos_para_ajax.html"]http://www.librosweb.es/ajax/capitulo7/utilidades_y_objetos_para_ajax.html[/URL]

Y este el codigo con el que me eh complicado la vida:
Código Javascript:
Ver original
  1. var net = new Object();
  2.  
  3. net.READY_STATE_UNINITIALIZED=0;
  4. net.READY_STATE_LOADING=1;
  5. net.READY_STATE_LOADED=2;
  6. net.READY_STATE_INTERACTIVE=3;
  7. net.READY_STATE_COMPLETE=4;
  8.  
  9. // Constructor
  10. net.CargadorContenidos = function(url, funcion, funcionError) {
  11.   this.url = url;
  12.   this.req = null;
  13.   this.onload = funcion;
  14.   this.onerror = (funcionError) ? funcionError : this.defaultError;
  15.   this.cargaContenidoXML(url);
  16. }
  17.  
  18. net.CargadorContenidos.prototype = {
  19.   cargaContenidoXML: function(url) {
  20.     if(window.XMLHttpRequest) {
  21.       this.req = new XMLHttpRequest();
  22.     }
  23.     else if(window.ActiveXObject) {
  24.       this.req = new ActiveXObject("Microsoft.XMLHTTP");
  25.     }
  26.  
  27.     if(this.req) {
  28.       try {
  29.         var loader = this;
  30.         this.req.onreadystatechange = function() {
  31.           loader.onReadyState.call(loader);
  32.         }
  33.         this.req.open('GET', url, true);
  34.         this.req.send(null);
  35.       } catch(err) {
  36.         this.onerror.call(this);
  37.       }
  38.     }
  39.   },
  40.  
  41.   onReadyState: function() {
  42.     var req = this.req;
  43.     var ready = req.readyState;
  44.     if(ready == net.READY_STATE_COMPLETE) {
  45.       var httpStatus = req.status;
  46.       if(httpStatus == 200 || httpStatus == 0) {
  47.         this.onload.call(this);
  48.       }
  49.       else {
  50.         this.onerror.call(this);
  51.       }
  52.     }
  53.   },
  54.  
  55.   defaultError: function() {
  56.     alert("Se ha producido un error al obtener los datos"
  57.       + "\n\nreadyState:" + this.req.readyState
  58.       + "\nstatus: " + this.req.status
  59.       + "\nheaders: " + this.req.getAllResponseHeaders());
  60.   }
  61. }


Ire colocando las partes en las que tengo problema para entender el codigo.

Código Javascript:
Ver original
  1. // Constructor
  2. net.CargadorContenidos = function(url, funcion, funcionError) {
  3.   this.url = url;
  4.   this.req = null;
  5.   this.onload = funcion;
  6.   this.onerror = (funcionError) ? funcionError : this.defaultError;
  7.   this.cargaContenidoXML(url);
  8. }
  9.  
  10. net.CargadorContenidos.prototype = {
  11.   cargaContenidoXML: function(url) {...}
  12.   onReadyState: function() {..}
  13.   defaultError: function() {...}

Desde el principio no entiendo bien que es lo que se hace, al principio supuestamente se construye un nuevo objeto pero no hay que poner el nombre con el cual se creara este objeto? Por ej. function cargadorContenido (..){...}

Luego cuando se define cada variable usando this.variable el "this" a que objeto se refiere? Al objeto net o a cargadorContenidos? Y como se sabe eso? Porque el this se refiere al objeto que lo llama pero hasta ahi cargadorContenidos es una funcion o no?

Bueno, y luego al mismo objeto se le agregan re metodos, y es que me pregunto, no es lo mismo agregarlo cuando definimos anteriormente a cargadorContenido?

Disculpen por tantas preguntas, espero que puedan ayudarme, les estare muy agradecido.
  #2 (permalink)  
Antiguo 02/03/2010, 18:12
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

Forma fea tienen de crear un objeto nuevo (¿"new Object()" en vez de "{}"?) pero bueno, vaya uno a saber...

Lo que sucede en la línea 2 es que se crea una nueva función anónima con function(), y esa función anónima se asigna a cargadorContenidos, resultando en efecto igual a

Código Javascript:
Ver original
  1. function cargadorContenidos(...) { ... }
  2. net.CargadorContenidos = cargadorContenidos;

this se refiere a net.CargadorContenidos, es decir, a la función anónima que se creará. La idea luego es que los nuevos objetos "cargador" heredan las propiedades de este objeto función.

Este ejemplo utiliza una forma de herencia que no es la más apropiada en Javascript. Personalmente prefiero los prototipos, y seguir las recomendaciones de Douglas Crockford para conseguir herencia entre objetos, que es la forma "nativa" de javascript.

El ejemplo se puede modificar fácilmente para ser más entendible, el siguiente código es equivalente (aunque no funciona, requiere más cambios):

Código Javascript:
Ver original
  1. // función para herencia entre objetos
  2. if (typeof Object.create !== 'function') {
  3.   Object.create = function (o) {
  4.     function F() {}
  5.     F.prototype = o;
  6.     return new F();
  7.   };
  8. }
  9.  
  10. // se inicializan los objetos principales
  11. var net = {};
  12.  
  13. net.CargadorContenidos = {
  14.   url : null,
  15.   req : null,
  16.   onload : null,
  17.   onerror : null,
  18.  
  19.   cargaContenidoXML : function(url, funcion, funcionError) { ... },
  20.   onReadyState : function() { ... },
  21.   defaultError : function() { ... },
  22. }
  23.  
  24. // luego se lo puede llamar así
  25. var cargador = Object.create(net.CargadorContenidos)
  26. cargador.cargaContenidoXML(url, funcion, funcionError);
  #3 (permalink)  
Antiguo 02/03/2010, 21:25
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Gracias por responder.

Me quedo una duda, en que parte del codigo se define el nombre de la primer funcion? Ya que segun me dijiste el nombre es cargadorContenidos y no CargadorContenidos .

De nuevo gracias por contestar.
  #4 (permalink)  
Antiguo 03/03/2010, 12:41
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

No, no es así. No sé cuál sea tu conocimiento de programación, pero quizás nunca te hayas topado con un lenguaje en el que las funciones sean un tipo de dato como cualquier otro.

En Javascript así como en muchos otros lenguajes, las funciones pueden crearse sin nombre (usualmente se hace con funciones que serán utilizadas una sola vez). Luego podés asignar la referencia a la función a cualquier variable, de la misma forma que lo hacés con cualquier objeto.

Imagina esto: cuando hacés
Código Javascript:
Ver original
  1. this.req = new XMLHttpRequest();
estás creando un nuevo objeto XMLHttpRequest() sin nombre, y asignando ese objeto a "this.req", de tal forma que referenciar a this.req equivale a referenciar al objeto.
De la misma forma, cuando hacés
Código javascript:
Ver original
  1. net.CargadorContenidos = function(url, funcion, funcionError) {
estás creando un nuevo objeto función (una nueva función) sin nombre, y asignando este objeto a "net.CargadorContenidos", de tal forma que referenciar a net.CargadorContenidos() equivale a llamar a la función.

Siguiendo el ejemplo, una vez que obtenés la referencia podés hacer cualquier cosa con ella, incluso copiarla a otra variable.

Código Javascript:
Ver original
  1. var miVariable = this.req; <-- referencia al mismo objeto creado antes
  2. var miFuncion = net.CargadorContenidos; <-- referencia a la misma funci&#243;n creada antes

Espero que ahora esté más claro.


Saludos.
  #5 (permalink)  
Antiguo 03/03/2010, 12:55
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Gracias nuevamente por responder.

Hasta ahora venia bastante bien con javascript. El problema me surge al llegar al momento en que se declara a net.CargadorContenidos como una funcion, y ya en este momento la podemos llamar como vos decis tipeando net.CargadorContenidos();

Pero luego en la siguiente parte de codigo:
Código Javascript:
Ver original
  1. net.CargadorContenidos.prototype = {...}

Es que no entiendo que es lo que se hace, lo que interpreto es que se le agregan tres metodos a net.CargadorContenidos pero luego no entiendo porque es que directamente no se los declara en la funcion anterior con algo tipo :
this.prototype.metodo1 (){...}

Estos metodos estan declarados como si net.CargadorContenidos fuese un objeto(array) asociativo (usando JSON es decir clave1 : valor1) y esto me confunde aun mas ya que CargadorContenidos es una funcion pero a la vez se lo trata como un array asociativo aunque estoy seguro que en alguna parte me perdi y estoy interpretando las cosas mal.
  #6 (permalink)  
Antiguo 03/03/2010, 13:11
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Constructores, y el uso del THIS

Esperemos la respuesta de AlvaroG (yo conozco poco de objetos en javascript )
pero mientras eso pasa lee un poco de objetos literales en javascript
ejemplo:
Código Javascript:
Ver original
  1. var Rotar = {
  2.     path: 'images/',
  3.     speed:  4500,
  4.     images: ["smile.gif", "grim.gif", "frown.gif", "bomb.gif"]
  5. }
esto es un ejemplo simple de objeto literal y si se parece mucho al JSON.

un saludo.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #7 (permalink)  
Antiguo 03/03/2010, 13:22
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Cita:
Iniciado por eits Ver Mensaje
Esperemos la respuesta de AlvaroG (yo conozco poco de objetos en javascript )
pero mientras eso pasa lee un poco de objetos literales en javascript
ejemplo:
Código Javascript:
Ver original
  1. var Rotar = {
  2.     path: 'images/',
  3.     speed:  4500,
  4.     images: ["smile.gif", "grim.gif", "frown.gif", "bomb.gif"]
  5. }
esto es un ejemplo simple de objeto literal y si se parece mucho al JSON.

un saludo.
Lo eh leido y si fuera solo eso lo comprenderia mejor pero es como si a eso se le agrega esto unas lineas mas arriba:
Código Javascript:
Ver original
  1. Rotar = function () {
  2. this.computadora = "ejemplo";
  3. alert(this.computadora);
  4. }

En ese caso primero el objeto se define como una funcion pero luego se le agregan otras cosas que nada tienen que ver con la funcion anterior. Y ahi es donde llego a la conclusion de que algo me estoy perdiendo, se puede hacer eso?
Seria algo asi como si pudiera llamarlo asi:
Código Javascript:
Ver original
  1. Rotar();
  2. var nuevaVariable = Rotar.path;

En ese caso Rotar lo podria usar para que actue como la funcion pero tambien lo usaria como el objeto que declaraste anteriormente.
  #8 (permalink)  
Antiguo 03/03/2010, 13:36
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Constructores, y el uso del THIS

Te sugiero leas esto para que te quede claro cómo funcionan esas cosas:
https://developer.mozilla.org/es/Gu%..._en_prototipos
  #9 (permalink)  
Antiguo 03/03/2010, 13:59
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Cita:
Iniciado por Panino5001 Ver Mensaje
Te sugiero leas esto para que te quede claro cómo funcionan esas cosas:
[url]https://developer.mozilla.org/es/Gu%C3%ADa_JavaScript_1.5/Lenguajes_basados_en_clases_frente_a_basados_en_pr ototipos[/url]
Muchas gracias me fue de mucha ayuda. El problema estaba en que hasta el momento siempre que se habia creado un objeto nuevo segun el libro se declaraba de esta manera:
Código Javascript:
Ver original
  1. function objetoNuevo () {..}

Y crei que era la unica manera de crear un objeto nuevo pero segun lei si escribiera:
Código Javascript:
Ver original
  1. objetoNuevo = function () {...}

Es lo mismo, corrijanme si me equivoco.

Osea que segun esto que acabo de leer net.CargadorContenidos es una funcion que se utiliza para crear un objeto nuevo con ese nombre. Y luego en la parte de abajo lo que se hace es definir unos valores predeterminados para net.CargadorContenidos , ahora esta bien lo que dije?

entonces a fin de cuentas al final de todo esto yo puedo crear esto:
Código Javascript:
Ver original
  1. var objetoNuevo = new net.CargadorContenidos(...) ;
  2.  
  3. // Luego puedo usar los metodos definidos por el prototipo:
  4.  
  5. objetoNuevo.metodo1 ;

La verdad que costo pero ahora me quedo todo bastante claro y listo para seguir progresando. Solo necesito qeu em confirmen si lo que acabo de decir es tal como lo dije o si sigo teniendo problemas en alguna parte.

GRACIAS A TODOS
  #10 (permalink)  
Antiguo 03/03/2010, 14:30
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

Respondiendo al mensaje 5:
objeto1.prototype es un enlace al objeto padre de objeto1, y es el objeto del cual hereda un objeto creado via "new objeto1()"
Si se añaden propiedades a objeto1, solamente objeto1 las tendrá. Si añades propiedades a objeto1.prototype, estarán disponibles para los objetos que desciendan de objeto1.
Relee el enlace que te pasé sobre herencia con prototipos (es una traducción mala, pero servirá) para más detalles. Te recomiendo utilizar la función object.create() definida allí y olvidarte del asunto: crea tus objetos con las propiedades que necesites, y usa object.create() para crear objetos que descienden de ellos.

Con respecto al mensaje 9:
Sí, ambas formas son equivalentes. Una diferencia es que usar
Código Javascript:
Ver original
  1. function objetoNuevo () {..}
crea una variable global, un objeto función de nombre "func1". Mientras que haciéndolo de la otra forma podés controlar el ámbito de la variable a crear, no tiene por qué ser global y, como en el ejemplo, podés crearla como propiedad de un objeto:
Código Javascript:
Ver original
  1. miobjeto.objetoNuevo = function () {...}

Si tenés que crear objetos, a menos que tengas una razón real para usar function(), usa la sintaxis literal:

Código Javascript:
Ver original
  1. var objeto = {};
  2. objeto.cualquiercosa = "algo";

o

Código Javascript:
Ver original
  1. var objeto = {
  2.     cualquiercosa : "algo"
  3. };

No hay necesidad de crear una función o llamar a "new Object()"

En definitiva, tu último comentario es correcto. Aunque como ves, es más difícil intentar emular el modelo clásico de herencia que hacerlo naturalmente con prototipos (si no me crees, nada más fíjate de nuevo en mi primer mensaje).


Saludos.
  #11 (permalink)  
Antiguo 03/03/2010, 14:37
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Constructores, y el uso del THIS

Cita:
Es lo mismo, corrijanme si me equivoco.
De hecho, no es exactamente lo mismo, pero en esencia si.

Prueba con esto:

Código Javascript:
Ver original
  1. hazalgo();
  2.  
  3. var hazalgo = function(){
  4.      alert('ya hice algo');
  5. }

Al intentar correr ese código te va a dar un error, ya que cuando asignas una función anónima a una variable, no puedes usar dicha función antes de que haya sido declarada. En este caso estas queriendo usarla antes de declararla y pues te tira un error. Por el otro lado, si solo usas notación literal, lo que se conoce como function literal, si puedes llamar a la función aun antes que haya sido declarada.

Código Javascript:
Ver original
  1. hazalgo();
  2.  
  3. function hazalgo(){
  4.      alert('ya hice algo');
  5. }

En este caso verás que todo funciona correctamente. Ahora, la cosa se pone interesante. Mira:

Código Javascript:
Ver original
  1. onload = hazalgo;
  2.         var hazalgo = function(){
  3.             alert('ya hice algo');
  4.         }

Veras que no pasa nada. Aun cuando la llamada se está haciendo al cargar la pagina, y se supone que para entonces la variable ya ha sido declarada, no pasa nada. Esto es por que la asignación se está haciendo antes de declarar la variable. Sin embargo, si en lugar de asignar directamente la función hazalgo al evento load de window, asignamos una función anónima que a su vez invoque a hazalgo, la cosa cambia:

Código Javascript:
Ver original
  1. onload = function(){
  2.     hazalgo();
  3. }
  4. var hazalgo = function(){
  5.     alert('ya hice algo');
  6. }

Podemos seguir probando con otros ejemplos y curiosidades, pero mi objetivo no es demostrar cuantas curiosidades hay entre estos dos tipos de declarar funciones. Mi objetivo es solo demostrar que aun que en esencia ambos métodos son similares, no son realmente iguales. Sin embargo, sin importar como declares una función, siempre puedes usarla con el operador new para crear una instancia de ese objeto. (Aquellos que argumentan la inexistencia de instancias en javascript, favor de abstenerse de iniciar un debate. Ha sido ampliamente de batido y demostrado que javascript SI tiene instancias.)

Ahora, en cuanto al script, no se por que agregan un método al objeto net, solo para después llamarlo con el operador new. Es un tanto incoherente diría yo.
__________________
twitter: @imbuzu
  #12 (permalink)  
Antiguo 03/03/2010, 14:38
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Bueno al fin logre entender. Solo unas dudas, tu dices que es mejor declarar un nuevo objeto asi:

var objetoNuevo = {...}

tiene alguna diferencia con declararlo asi:

var objetoNuevo = new Object();

ademas de tener que escribir un poco mas de codigo?


Hay alguna manera de crear el nuevo objeto definido en la funcion de otra manera que no sea??:

var ObjetoNuevo = new net.CargadorContenidos();

Gracias.
  #13 (permalink)  
Antiguo 03/03/2010, 14:57
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Constructores, y el uso del THIS

Realmente depende mucho de para que vas a usar el objeto. Yo no te diría que uses siempre una u otra forma, ya que la verdad no hay tal cosa como una forma mejor que otra. Simplemente depende de como vas a usar el objeto, cuantas veces y cosas por el estilo. Por ejemplo, si un objeto lo vas a usar más de una vez, definitivamente no te conviene usar notación literal, ya que para poder crear una nueva instancia de ese objeto tendrías que copiarlo todo y eso gasta memoria. Por el otro lado, si usas el constructor, solo necesitas llamar nuevamente a new para crear el objeto y todos los metodos no se copian pero permanecen accesibles ya que están, no en el objeto en sí, sino en su prototipo.
__________________
twitter: @imbuzu
  #14 (permalink)  
Antiguo 03/03/2010, 15:25
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

No hay diferencia entre "{}" y "new Object()", ambos crean objetos vacíos que heredan de Object (que es lo más alto de la jerarquía de objetos en Javascript, y por lo tanto todo hereda de él)
Aún si existieran diferencias (que desconozco), el uso que se les da es equivalente.

Cita:
Iniciado por buzu Ver Mensaje
Por ejemplo, si un objeto lo vas a usar más de una vez, definitivamente no te conviene usar notación literal, ya que para poder crear una nueva instancia de ese objeto tendrías que copiarlo todo y eso gasta memoria. Por el otro lado, si usas el constructor, solo necesitas llamar nuevamente a new para crear el objeto y todos los metodos no se copian pero permanecen accesibles ya que están, no en el objeto en sí, sino en su prototipo.
La notación literal es mejor por su claridad, pero depende de gustos, como todo lo que se puede hacer de más de una forma. Además la recomendación de usarla es solamente para crear el objeto inicial. Se use la forma que se use, se supone que uno no crea muchos objetos iguales, eso no se hace ni en el modelo clásico ni en el modelo con prototipos. En ambos modelos se crean objetos con las propiedades necesarias, y luego se hereda de ellos. En ninguno de los modelos hay duplicación inútil.


Saludos.
  #15 (permalink)  
Antiguo 03/03/2010, 15:34
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Constructores, y el uso del THIS

Alvaro, no es que se creen muchos objetos iguales, sino muchas instancias. Por ejemplo, si yo hago un objeto para opacar elementos logrando un efecto tipo fade, se puede crear un objeto y después instanciarlo tantas veces como sea necesario. Todo depende del modelo de programación que uses, por que se puede lograr lo mismo de ambas formas, sin embargo, en deteminado momento querras usar una u otra según el caso, es por eso que digo que no hay una forma que sea mejor que otra ni universalmente mas recomendable que otra ya que todo depende de muchos otros factores.
__________________
twitter: @imbuzu
  #16 (permalink)  
Antiguo 03/03/2010, 16:11
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Constructores, y el uso del THIS

Entiendo y estoy de acuerdo, pero me parece que la pregunta de aguila_393 era más básica y específica, refiriéndose a la diferencia entre "{}" y "new Object()", que son funcionalmente equivalentes y por tanto creo que usar "{}" es preferible.
  #17 (permalink)  
Antiguo 03/03/2010, 17:06
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Constructores, y el uso del THIS

En eso te llevas la razon.
__________________
twitter: @imbuzu
  #18 (permalink)  
Antiguo 03/03/2010, 19:28
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Cita:
Iniciado por AlvaroG Ver Mensaje
Entiendo y estoy de acuerdo, pero me parece que la pregunta de aguila_393 era más básica y específica, refiriéndose a la diferencia entre "{}" y "new Object()", que son funcionalmente equivalentes y por tanto creo que usar "{}" es preferible.
No importa, de los que saben se aprende, y mientras ustedes discuten seriamente yo puedo seguir aprendiendo y ver las cosas de distintos puntos de vista. Asique gracias a los dos y a todos los que me ayudaron .

Simplemente les puedo dar unos aplausos Y gracias por todo nuevamente.
  #19 (permalink)  
Antiguo 03/03/2010, 19:45
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Solo una pregunta mas y los dejo tranquilos :P.

No es lo mismo declarar dentro de la funcion que construye el objeto los metodos declarados con el prototipo mas tarde? Algo como esto:

Código Javascript:
Ver original
  1. net.CargadorContenidos = function () {
  2. this.req = req ;
  3. this.prototype.metodo1 = function () {..}
  4. this.prototype.metodo2 = function () {...}
  5. }
  #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
  #21 (permalink)  
Antiguo 04/03/2010, 08:54
Avatar de aguila_393  
Fecha de Ingreso: septiembre-2007
Ubicación: Argentina
Mensajes: 406
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Constructores, y el uso del THIS

Gracias, creo que eso seria todo por ahora. Cuando me surga algo mas les vuelvo a pedir ayuda.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:06.