Foros del Web » Programando para Internet » Javascript »

Otra con funciones y objetos...

Estas en el tema de Otra con funciones y objetos... en el foro de Javascript en Foros del Web. Hola foro... Antes.. Felices fiestas a todos y q la sigan pasando super bien!! Bueno... tratare de ser preciso y brebe.. Supongamos 2 funciones declaradas ...
  #1 (permalink)  
Antiguo 28/12/2008, 10:29
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Otra con funciones y objetos...

Hola foro...

Antes.. Felices fiestas a todos y q la sigan pasando super bien!!

Bueno... tratare de ser preciso y brebe..

Supongamos 2 funciones declaradas como globales y un objeto con 2 metodos

Código PHP:
function f1(){...},
function 
f2(){...} 
Código PHP:
var mi_obj=function(){
 
this.f1=function(){...}
 
this.f2=function(){...}

Al declarar funciones como globales quedan siempre en memoria y estarán cargadas asi no las use... pero cada vez q llame a la funcion, la 'llamada' será más rápida por q dicha funcion ya fue cargada?

En el caso de objetos, si deseo usar una de sus funciones (o metodos), se crea el objeto y luego uso sus funciones... pero no demora mas el tener q crearlo y despues usalo que en el caso anterior q la funcion ya esta declarada?

cuando declaro un objeto... queda cargado en memoria como las funciones? o es como si estubiera 'ahi ' pero solo se carga en memoria cuando se lo llama para crearlo o se referencia a un objeto existente para aplicarlo?

supongamos q tengo un objeto con 50 funciones (metodos)... creo un objeto por q me interesa solo uno de sus metodos... no es un desperdicio tener q crearlo completamente si en realidad me interesa solo algunas lineas de su code?

cual es entonces el beneficio real de trabajar con objetos y no con funciones globales...

P.D. POR SI LES INTERESA..

Estas preguntas estan en base al analisis del codigo de thickbox... este conocido plugin de jquery trabaja con funciones globales y no como una extencion del objeto jquery.... logre hacer que thickbox tabaje como una extencion del jquery es decir...

antes llamaba a thickbox con tb_init([selector]), que claramente son funciones globales, ahora hice las dos modalidades....

$([selector]).thickbox();

y tambien

$.thickbox([selector])

GRACIAS!!!
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
  #2 (permalink)  
Antiguo 28/12/2008, 14:39
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Otra con funciones y objetos...

En mi opinión de metiche profesional:

- siempre el proceso de ejecutar la función será más rápido que el proceso de crearla y ejecutarla. Pero la creación se hace una sola vez, así que tampoco es para tanto

- cuando declarás el objeto con sus funciones las estás creando. Dado que todas las funciones se crean dentro de un objeto (en el caso del navegador, el objeto window), la única sobrecarga que estás generando es la de crear una variable. No parece mucho

Javascript es un lenguaje funcional, lo cual entre otras cosas quiere decir que las funciones son variables como cualquier otra. Por lo tanto, lo que le suceda a un objeto en su condición de variable le podrá suceder a una función también, lo mismo a la inversa. Por tanto, la respuesta es la misma que a la pregunta 1

pues sí que es un desperdicio, sin duda: el navegador tendrá que compilar las 50 funciones solamente para usar 1. Pero sería lo mismo cargar 50 funciones: lo que está fallando ahí es la modularización de tu programa JS

La misma ventaja que tiene trabajar con POO en vez de programación estructurada, la misma ventaja que tiene siempre evitar llenar el espacio de nombres global con nuestras variables. dentro de lo posible hay que encapsular lo que agreguemos para evitar conflictos.


Saludos.
  #3 (permalink)  
Antiguo 28/12/2008, 15:48
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Otra con funciones y objetos...

Bueno, antes de nada perdona si no contesto a las preguntas todavía. Primero, unas ideas generales.

En primer lugar, en Javascript las funciones son objetos, de modo que la diferencia en cuanto a la declaración, creación, vida y destrucción de funciones y objetos, es... bueno, poca. La diferencia, en realidad está más en cómo los manejes.

Javascript tiene recolección de basura y funciona, en este sentido, como cualquier otro lenguaje. Cualquier objeto (léase objeto o función), desde su creación permanece en memoria hasta que es destruído. Cuando no existen más referencias a ese objeto (recuerda las funciones también son objetos), entonces se marca para ser eliminado y luego se elimina.

Para un manejo normal de funciones y objetos (es decir, si no entramos a buscar -por ahora- mejores formas de controlar qué funciones u objetos se cargan), en el declaramos ambos de la forma habitual, la diferencia va a ser nula. Ambos se cargarán en memoria y estarán disponibles.

La diferencia más importante, de hecho, va a ser una de organización. Si todo el mundo declara sus funciones en el namespace global, es mucho más caótico todo y es más probable que ocurra alguna colisión de nombres. Es decir, si tú en tu librería declaras la función truncate() y yo en la mía declaro otra función truncate(), ambas librerías no podrán ser utilizadas a la vez así como así. Sin embargo, si tú declaras todas las funciones de tu librería dentro de un objeto KQuery y yo las declaro dentro de un objeto VQuery entonces nuestras funciones no entran en conflicto porque se llaman KQuery.truncate() y VQuery.truncate().


¿Cuándo se cargan las cosas en memoria? Básicamente cuando se parsean. Es decir, cuando cargas un fichero.js se lee, y parsea su contenido. Si se lee la declaración de una función o de un objeto (es lo mismo, luego lo vemos), entonces se crea ese objeto o función.



Ahora bien, volviendo a tu código y a tus preguntas, el primer problema está en el código que pones, que no sé si realmente hace lo que quieres decir o si, dicho de otro modo, es equivalente. Veamos los siguientes trozos de código y lo que hace cada uno:

Código javascript:
Ver original
  1. // código A:
  2. function f1() { ... }
  3.  
  4. // código B:
  5. var f2 = function() { ... }
  6.  
  7. // código C:
  8. var o1 = {
  9.     f1: function() { ... },
  10.     f2: function() { ... }
  11. }
  12.  
  13. // código D1:
  14. var g1 = function() {
  15.     this.f1 = function() { ... };
  16.     this.f2 = function() { ... };
  17.     return this;
  18. }
  19. // código D2:
  20. var o2 = new g1();
  21.  
  22. // código E:
  23. var o3 = (function() {
  24.     this.f1 = function() { ... };
  25.     this.f2 = function() { ... };
  26.     return this;
  27. })();

Bien, A y B hacen exactamente lo mismo. Crean la función declarada literalmente y la asignan a la variable f1 o f2. C es interesante porque es básicamente lo mismo. Crea el objeto declarado con el literal y lo asigna a o1.

Cualquiera de esos casos, cuando se parsea tiene el efecto indicado de crear f1, f2 u o1, respectivamente. Es similar en cualquiera de los tres.

El código E tiene el mismo efecto que D1 y D2 juntos: Crear una función generadora y utilizarla para generar un nuevo objeto. He puesto E por ser más completo, pero realmente el caso que más puede interesar es D.

Al parsear D1, se crea el objeto que he llamado g1. Este no debe confundirse con el objeto que se crea cuando se ejecuta D2. En D2 usamos g1 para generar un nuevo objeto, que asignamos a o2. Este (D2) es el único caso en que estamos creando un objeto dinámicamente, en el momento de ejecutar esa línea.

En cualquiera de los otros casos (A,B,C,E), el resultado es el objeto final (f1,f2,o1,o3). En el caso D hay 2 pasos bien diferenciados, D1 y D2.

Pero, para el caso que estás planteando, en realidad D no es un caso relevante.



Así que después de todo este rollo, pasemos a ver tus preguntas...

1º. No entiendo muy bien. ¿Será "más rápida" que cuándo? La función se crea y carga en memoria al parsear el archivo. Una vez creada ahí está.
2º. Lo mismo. El objeto se crea al parsear el fichero (salvo en el caso D2). Es decir, que estamos en la misma situación que en la pregunta anterior. Una vez creado, ahí está.
3º. Esto creo que ya está respondido, no?
4º. Hombre, si sólo te interesa ese único método y el resto sabes que no lo vas a usar nunca, pues sí es un "desperdicio" cargar un montón de código que sabes que no vas a usar. Esto es igual si creas un objeto con 50 funciones que no usas o si creas 50 funciones que no usas en el namespace global. Es lo mismo.
5º. Esto es lo que contestaba ya más arriba. El tema de la organización y la colisión de nombres.


Bueno, ya paro. Espero que hayas sacado algo en claro. Si no, intentaré aclararlo mejor.
  #4 (permalink)  
Antiguo 29/12/2008, 08:38
Avatar de killerangel  
Fecha de Ingreso: septiembre-2007
Ubicación: Un punto en el espacio
Mensajes: 592
Antigüedad: 16 años, 7 meses
Puntos: 10
Respuesta: Otra con funciones y objetos...

Muy buenas respuestas!!!

digamos q tenia la idea de que al trabajar con objetos, estos se cargaban en memoria al ser llamados para crear y luego se 'descargaban' quedando tan solo el nuevo objeto creado, y que con las funciones pues éstan siempre estaban ahi... asi q su aplicacion es mas 'directa'...

Sus respuestas las lei ayer y la verdad no sabía q decir al respecto.
Cuando empecé como autodidacta en lo q es la programación web, sabía q era un largo camino, y a pesar de lo q he avanzado me doy cuenta de lo poco q y con sus respuestas hasta me siento avergonzado frente a muchos como ustedes… jeje

Lo bueno es que gracias personas como ustedes, aprender se hace agadable… asi q solo me keda decir…

GRACIAS XICOS!!
__________________
Sueñen... y trabajen por hacer esos sueños realidad... de eso se construye el futuro!!
Me siento entre la ASP-ada y la PHP-red
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 08:26.