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.appendChild( document.createTextNode(q) );
if(!noBr) document.body.appendChild( document.createElement("BR") );
}
var a = 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".