Foros del Web » Programando para Internet » Javascript »

Como sabes la existencia de un método en una Clase?

Estas en el tema de Como sabes la existencia de un método en una Clase? en el foro de Javascript en Foros del Web. loading.......... Código PHP: var  a = function() {    this . algo =function(){   }; }  Como saber que this.algo existe?, sin hacer una INSTANCIA A LA ...
  #1 (permalink)  
Antiguo 09/05/2007, 11:09
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Como sabes la existencia de un método en una Clase?

loading..........

Código PHP:
var a= function()
{
  
this.algo=function(){
  };

Como saber que this.algo existe?, sin hacer una INSTANCIA A LA CLASE.


connection closed.
__________________

Maborak Technologies
  #2 (permalink)  
Antiguo 09/05/2007, 11:21
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Como sabes la existencia de un método en una Clase?

Hola:

Haciendo un bucle asociativo puedes obtener todos los items de cualquier objeto, por ejemplo para window:

var ventanitas = new Array();
for (i in window) ventanitas[ventanitas.length] = i;

alert(ventanitas);

Luego, si hay alguna variable, basta con ver si la instancia está "undefined"

if (a["algo"] == undefined)...

Información adicional: Nuevo destripador

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 09/05/2007, 13:17
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Re: Como sabes la existencia de un método en una Clase?

loading...........


Gracias, el problema es que mi CLase no está instanciada

Código PHP:
var g=new a(); 
he intentado con
Código PHP:
for(i in a)
{

}
// OR
alert(a.prototype.algo); 
pero no funciona


connection closed.
__________________

Maborak Technologies
  #4 (permalink)  
Antiguo 13/05/2007, 17:01
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Como sabes la existencia de un método en una Clase?

Supongo que sin instanciar un objeto de esa clase es un poco complicado... Puedes intentar hacer:
Código PHP:
function cosa(ref) {
    
this.ref=ref;
    
this.f1=function() {
        return 
this.ref;
    }
    function 
f2() {
        return 
this.ref;
    }
    
this.f2=f2;
    
this.f3=Function("return this.ref");
}

document.write("<pre>"+cosa+"</pre>"); 
Teniendo en cuenta que cosa imprime lo que devuelve cosa.toString(), en ello está contenido el código que construye un objeto cosa. Así que puedes buscar en esa cadena las tres formas de declarar un método que te he puesto. Claro que supongo que quedarían más, está el
Código PHP:
cosa.prototype.f10=function() { } 
que no sabría cómo detectar.

La verdad es que pienso que sin hacer una instancia de la clase es imposible, no leo veo sentido a no poder instanciarla.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 14/05/2007, 15:08
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Re: Como sabes la existencia de un método en una Clase?

loading...........

Bueno, curioso pero...
Si haces.
1)
Código PHP:
var = function()
{
 
this.b=56;

y

2)
Código PHP:
var = function(){}
a.prototype.b=56
Ambos funcionan de la misma forma pero ya al hacer.

Código PHP:
alert(a.prototype.b
Solo en el caso 2 me devuelve el valor... pero no puedo crear propiedad o métodos con prototype!!! porque usaré Clases.. de esta forma

Código PHP:
leimnud.gestiona.to.algo("algo",function(){
this.bla=345;
this.otro=456;
}); 
Osea pasar la clase como argumento.

Aunque tambien podria hacer.
Código PHP:
var algo=function(){}
algo.prototype.bla=345;
algo.prototype.otro=456;
leimnud.gestiona.to.algo("algo",algo); 
Pero quiero evitar tener que crear la variable ALGO en memoria....hago una aplicación "muy pesada".


connection closed.
__________________

Maborak Technologies
  #6 (permalink)  
Antiguo 14/05/2007, 17:28
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Como sabes la existencia de un método en una Clase?

La verdad, me he perdido :(

Al hacer
a.prototype.b=Function("return 'hola'");
Lo que haces es asignarle una propiedad a a.prototype, o a una instancia de a (new a()) no a a, por eso a.b no funciona.

Cuando lo instancias (new a()) entonces sí que los métodos (funciones de a) funcionan, al instanciarlo podemos utilizar el prototype directamente. PERO SÓLO DIRECTAMENTE: Es decir, no podemos poner new a().prototype.b, pero sí a.prototype.b; sin embargo a.b NO funciona (porque no es instancia) mientras que new a().b sí (al instanciarlo, sí).


No sé si he llegado a algo en claro, o me he liado más:
Código PHP:
function e(q,noBr) {
    
document.body.appendChilddocument.createTextNode(q) );
    if(!
noBrdocument.body.appendChilddocument.createElement("BR") );
}

var 
= function(){ }
a.prototype.b=Function("return 'hola'");  
a.c=Function("return 'adios'");
try { 
e("a.b = "+a.b); } catch(error) { e("Lo siento, a.b no se puede hacer: "+error.message); }
try { 
e("new a().b = "+new a().b); } catch(error) { e("Lo siento, new a.b() no se puede hacer: "+error.message); }
try { 
e("a.c = "+a.c); } catch(error) { e("Lo siento, a.c no se puede hacer: "+error.message); }
try { 
e("new a().c = "+new a().c); } catch(error) { e("Lo siento, new a().c no se puede hacer: "+error.message); }
e("");
try { 
e("a.prototype.b = "+a.prototype.b); } catch(error) { e("Lo siento, a.prototype.b no se puede hacer: "+error.message); }
try { 
e("a.prototype.c = "+a.prototype.c); } catch(error) { e("Lo siento, a.prototype.c no se puede hacer: "+error.message); }
try { 
e("new a().prototype.b = "+new a().prototype.b); } catch(error) { e("Lo siento, new a().prototype.b no se puede hacer: "+error.message); }
try { 
e("new a().prototype.c = "+new a().prototype.c); } catch(error) { e("Lo siento, new a().prototype.c no se puede hacer: "+error.message); } 
CONCLUSIÓN: Cuando a no está instanciado, y algo está declarado mediante prototype (b), debemos llamarlo con .prototype. Al instanciarlo lo llamaremos directamente, sin prototype, como objeto (o método) de la instancia.
Al declararlo sin prototype (c), queda declarado como "propiedad directa" de a, y nada más: Accederemos a ella directamente. Instanciado no habrá manera de llegar hasta c.




Creo que estoy liando la marrana más...



Un saludo MaBoRaK, y explicame mejor ese
Cita:
Iniciado por MaBoRaK
Pero quiero evitar tener que crear la variable ALGO en memoria....hago una aplicación "muy pesada".
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 01:11.