Foros del Web » Programando para Internet » Javascript »

Problema con metodo en clases...

Estas en el tema de Problema con metodo en clases... en el foro de Javascript en Foros del Web. Que tal compañeros, vengo a ustedes porque tengo un problema con los metodos de 2 clases, verán, si estancio las dos clases en un mismo ...
  #1 (permalink)  
Antiguo 31/10/2012, 01:38
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 8 meses
Puntos: 406
Problema con metodo en clases...

Que tal compañeros, vengo a ustedes porque tengo un problema con los metodos de 2 clases, verán, si estancio las dos clases en un mismo archivo, pero si hay un metodo en cada clase que tenga el mismo nombre Javascript no diferencia los metodos de cada clase, si llamo al metodo "sumar" en la clase B (que se estancio después de la clase A) me llama al metodo pero de la clase A, mas no en metodo de la clase B, mi problema es que ambas clases reciben parametros diferentes (tanto en tipo como en numero), por lo cual me genera un error, mi pregunta es como hacer que Javascript diferencie cada metodo en su clase pertinente, dejo un ejemplo para que sea mas claro...

Código Javascript:
Ver original
  1. var ClassA = function() {
  2.     var palabra = '';
  3.  
  4.     this.genPalabra = function() {
  5.         generar();
  6.  
  7.         return palabra;
  8.     }
  9.  
  10.     generar = function() {
  11.         for(var i=0; i<10; i++) {
  12.             palabra = palabra + ' pruebaA ' + i;
  13.         }
  14.     }
  15. }
  16.  
  17. var ClassB = function() {
  18.     var palabra = '';
  19.  
  20.     this.genPalabra = function() {
  21.         generar();
  22.  
  23.         return palabra;
  24.     }
  25.  
  26.     generar = function() {
  27.         for(var i=0; i<10; i++) {
  28.             palabra = palabra + ' pruebaB ' + i;
  29.         }
  30.     }
  31. }
  32.  
  33. var classA = new ClassA();
  34. classA.genPalabra(); //me genera prubaA X
  35.  
  36. var classB = new ClassB();
  37. classB.genPalabra(); //me genera pruebaA X

Entiendo que Javascript esta muy lejos de tener POO decente, pero al menos deberia entender sobre que metodo es de cada clase y llamar a dicho metodo, en fin, ese es mi problema, no se si alguién tenga idea de como resolver esto que no sea cambiar el nombre del metodo.

Agradesco cualquier comentario o aportación....
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #2 (permalink)  
Antiguo 31/10/2012, 06:33
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 6 meses
Puntos: 1012
Respuesta: Problema con metodo en clases...

el problema que dices tener, realmente no lo tienes

genPalabra es un método privilegido lo cual implica que puede acceder a los métodos privados declarado en el ámbito de ClassA o ClassB

vuelve a probarlo por que creo que te has ofuscado
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #3 (permalink)  
Antiguo 31/10/2012, 06:45
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 8 meses
Puntos: 406
Respuesta: Problema con metodo en clases...

Muchas gracias por responder, tal vez estoy mas ofuscado de lo que pienso, pero en verdad me esta sobre escribiendo el metodo/función, verás tengo dos clases Core.js y Session.js, en ambas tengo un metodo llamado "request" que envia una petición Ajax según los parámetros enviados:

Core.js
Código Javascript:
Ver original
  1. var Core = function() {
  2.      //otras propiedades y metodos
  3.  
  4.      request = function(urlAjax,tipo,datosTipo,callback,historial) {
  5.         debug('Ajax: nueva petición del tipo ' + tipo + ' a ' + urlAjax);
  6.         removeDinamicEvents();
  7.  
  8.         var connect = $.ajax({
  9.             url: urlAjax,
  10.             type: tipo,
  11.             cache: false,
  12.             dataType: datosTipo
  13.         });
  14.  
  15.         var responseAjax = null;
  16.  
  17.         ajaxNotification(urlAjax,tipo);
  18.  
  19.         connect.done(function(data) {
  20.             debug('Ajax: respuesta satisfactoria');
  21.  
  22.             debug('Ajax: guardamos la peición como la ultima enviada');
  23.             _ultPeticion = {
  24.                 'urlAjax': urlAjax,
  25.                 'tipo': tipo,
  26.                 'datosTipo': datosTipo,
  27.                 'callback': callback,
  28.                 'historial': historial
  29.             }
  30.  
  31.             if (callback != 'return') {
  32.                 debug('Ajax: enviamos los datos obtenidos a la función callback ' + callback);
  33.                 window[callback].apply(null, [data,urlAjax,historial]);
  34.             }else {
  35.                 debug('Ajax: retornamos los datos');
  36.                 responseAjax = data;
  37.             }
  38.         });
  39.  
  40.         connect.fail(function(jqXHR, error) {
  41.             debug('Ajax: petición fallida, error ' + error);
  42.  
  43.             if (callback != 'return') {
  44.                 debug('Ajax: enviamos los datos obtenidos a la función callback ' + callback);
  45.                 window[callback].apply(this, [jqXHR.responseXML,urlAjax,historial]);
  46.             }else {
  47.                 debug('Ajax: retornamos los datos');
  48.                 responseAjax = data;
  49.             }
  50.         });
  51.     }
  52. }

Session.js
Código Javascript:
Ver original
  1. var Session = function() {
  2.     sessionRequest = function(urlAjax,tipo,callback,vars) {
  3.         debug('Session: nueva petición ajax');
  4.  
  5.         if (typeof vars == 'undefined') {
  6.             var connect = $.ajax({
  7.                 url: urlAjax,
  8.                 type: tipo,
  9.                 cache: false
  10.             });
  11.         }else {
  12.             var connect = $.ajax({
  13.                 url: urlAjax,
  14.                 type: tipo,
  15.                 cache: false,
  16.                 data: vars
  17.             });
  18.         }
  19.  
  20.         var responseData;
  21.  
  22.         connect.done(function(data) {
  23.             debug('Session: petición recibida con exito');
  24.  
  25.             if (callback != 'return') {
  26.                 debug('Session: llamando a la función ' + callback);
  27.                 window[callback].apply(null, [data]);
  28.             }else {
  29.                 debug('Session: guardamos el resultado para retornarlo');
  30.                 responseData = data;
  31.             }
  32.         });
  33.  
  34.         connect.fail(function(jqXHR,error) {
  35.             debug('Session: error al recibir la petición, error ' + error,'warn');
  36.         });
  37.  
  38.         if (typeof responseData != 'undefined') {
  39.             debug('Session: retornamos el valor!');
  40.             return responseData;
  41.         }
  42.     }
  43. }

Ambos metodos son muy parecidos, pero dentro de su ambito no lo son, el problema esta que las llamadas a dicho metodo dentro de cada clase siempre me las envia a la clase que se estancia al final, por lo cual se sobre escribe el primer metodo, al final, "window[callback]" me produce error porque no recibe el nombre de alguna función, si no recibe "tipoDato" (que puede ser XML, JSON, HTML), estoy buscando una solución pero no la encuentro, si te das cuenta, al final para seguir avanzando eh cambiado los nombres de los metodos, pero para mi eso es solo un parche, no una solución real, aun así sigo buscando como evitar este problema...

Gracias por tu tiempo en leer y contestar...

Nota: el metodo debug también se sobre escribe, aunque hay no tengo problema porque el metodo es el mismo en ambas clases...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 31/10/2012 a las 06:50
  #4 (permalink)  
Antiguo 31/10/2012, 07:51
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 8 meses
Puntos: 1485
Respuesta: Problema con metodo en clases...

buenas,
acostumbrese a declarar las variables con var. si bien como dice @isabelm, el método genPalabra se declara en el ámbito de cada clase pero en este caso pasan a ser globales y no locales debido a la iniciación sin var. simplemente debes poner por detrás de generar el keyword var. o bien puedes declarar la función (function declaration). es decir, function name (parameters) { body }. automáticamente javascript lo considera local al ámbito en que se declara.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 31/10/2012, 08:02
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 8 meses
Puntos: 406
Respuesta: Problema con metodo en clases...

Muchas gracias por contestar @zerokilled...

Si bien entiendo, en Javascript para tener metodos públicos es necesario usar "this", sin embargo ahora con tu explicación me eh confundido un poco, usar el keyword "var" es unicamente para tener metodos privados (y obtener de alguna forma encapsulación) o es recomendable también para los metodos públicos, o de plano lo que estoy diciendo es una locura y unicamente es para los metodos privados?, de todos modos haré pruebas para ver como se comporta, gracias de nuevo por contestar...

Actualización: Eh estado "jugando" con esto de los "metodos locales o privados" y ahora eh notado un "problema" curioso, al agregar el keyword "var" a los metodos la función "window[callback]" me dejo de funcionar, por lo cual recurrí a "callback.apply(parámetros)", ahora mi duda es, que diferencia hay entre una y otra (window[callback] y callback.apply() o callback.call())? de antemano gracias por su ayuda!

Nota: por cierto, con el cambio a callback.apply() tube que cambiar la definición del nombre de la función a llamar, antes lo definia como string (el nombre de la función o metodo entre comillas o apostrofes), ahora debo pasarlo como variable...
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 31/10/2012 a las 08:23
  #6 (permalink)  
Antiguo 31/10/2012, 08:58
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 8 meses
Puntos: 1485
Respuesta: Problema con metodo en clases...

bueno, tu confusión te tiene en un estado de locura, es lo único que tengo claro. si bien para hacer un método público se declara con this y para hacerlo privado se declara con var. ahora bien, tengase claro que esa asociación a sido atribuida como una forma de ver la implementación de clases en javascript. pues var en realidad es para declarar una variable de ámbito local. pero debido a ciertas características del lenguaje, se nos permite emular las clases u otra cosa. veamos.

Código:
function Klass(){
this.public = function(){ return "me acabas de invocar, ¿qué quieres?"; };
this.publicMember = "soy feo, pero no me molestes =(";
this.privileged = function(){ return private() +", "+ privateMember; };
var privateMember = "no me puedes tocar! =þ";
function private(){ return "soy el agente privado 007"; }
}

/* para probar en consola */
var k = new Klass();
k.public(); // "me acabas de ...";
k.publicMember; // "soy feo, ...";
k.private(); // se levanta una excepción porque no existe un miembro público llamado private;
k.privateMember; // devuelve undefined porque ese miembro no esta declarado;
k.privileged(); // "soy el agente ...";
en este ejemplo tienes tres miembros públicos y dos privados. los miembros privados no se pueden accesar desde el exterior. uno de los miembros públicos se le dice privilegiado porque tiene acceso a los miembros privados. si ese miembro privilegiado no existiera, en circunstancias normales lo que sucedería es que al finalizar la ejecucción del constructor Klass las variables locales se destruyen. pero en este ejemplo, al existir un método público que tiene acceso a los miembros privados, estos no se destruyen. eso es lo que se conoce como closure, la metodología de encapsulación en javascript. es a través de esta técnica que se implementa el concepto de clases en javascript.

Cita:
Actualización: Eh estado "jugando" con esto de los "metodos locales o privados" y ahora eh notado un ...
hay una diferencia muy grande entre window[callback] y callback.apply. en el primero se asume dos cosas: primero y más importante que la declaración del callback está definida en el ámbito de window o lo mismo que en el entorno global. y segundo que el parámetro callback es un string. recuerda que esta sintaxis object[string] es una forma alterna a object.property. el segundo caso, callback.apply se entiende que el parámetro es una referencia a la función en si. es decir, que al invocar la función entre los argumentos debes pasar una referencia de una función.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 31/10/2012 a las 15:34 Razón: corrección en comentario
  #7 (permalink)  
Antiguo 31/10/2012, 09:03
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 8 meses
Puntos: 406
Respuesta: Problema con metodo en clases...

Excelente explicación, ahora queda claro, gracias por la ayuda!
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Etiquetas: metodo
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 19:55.