Namespaces de javascript
4 seguidores
Meddle sacó el tema a raíz de una pregunta mía, estuve buscando más info en internet pero poca cosa he encontrado (por no decir ninguna) acerca de los namespaces. Parecen muy potentes y una forma muy interesante de estructurar el javascript, que a poco que te descuides se te hace un maremágnum de cosas y funciones varias, globales, no globales, etc.
¿Alguien tiene más info? ¿Meddle? ;)
meddle
siento no poder extenderme, pero si necesitais algo ire entrando al foro, dejar las preguntas por aki:
tom trenka habla de namespacing
sole
Me sabe a poco... En cuanto puedas molaría que dejaras algún otro link que conozcas. Gracias de todas formas :)
meddle
es que no conozco mas links, lo que si puedo hacer, pero eso ya depende de mi escaso tiempo es escribir yo algo.
de todas maneras, dudo q tengas dudas (valga la rebuznancia) pero si es el caso, suelta a ver q se puede hacer.
sole
Más que nada era por ver ejemplitos, casos de aplicación, bueno, ya sabes. Bueno investigaré más... otra vez gracias ;)
meddle
ahhh ejemplos si tengo ;)
En meddle v3 (no terminada) uso estos dos archivos.
En mtv usé este js (ver donde pone Simple rollover y compara con donde pone Accessible Buffer Script (ahi no hay namespace, por falta de tiempo basicamente)
En esta otra web uso entre otros este js o este otro
etc etc
XrV
joder, yo creía que un namespace era algo más complicado de entender... a ver si saco un rato esta mañana y ya te pongo un ejemplito :) (y si no que se lo curre meddle que yo no los he usado nunca por ese nombre)
sole
yo es que ya los entendía de C++ ;)
XrV
Un namespace no es más que un objeto contenedor de todo tu código. Se usa para tener encapsulado todo tu código y, en caso de usarlo juntamente con otro código así será 100% compatible (en caso de usarse el mismo nombre de variable, propiedad, método, objeto, etc...).
Un claro ejemplo de namespace es el siguiente:
var contenedor1={};//definimos un objeto (nuestro namespace)
var contenedor2={};//definimos otro objeto (otro namespace)
contenedor1.soyguay=function(){
alert("somos lo mas");
}
contenedor2.soyguay=function(){
alert("no veas nen");
}
Como puedes ver, tenemos dos métodos con el mismo nombre y los podemos llamar simplemente desde su namespace.
contenedor1.soyguay(); //<- llamamos al método soyguay del primer namespace
contenedor2.soyguay(); //<- llamamos al método soyguay del segundo namespace
vale, ahora meddle se tan amable de corregirme ya que no se si me he ido de la olla o que :P
meddle
esta prefesto :)
solo añadir que se puede hacer de varias formas. por ejemplo marc ha usado la notacion literal para crear el namespace:
var miNamespace = {}
Esto es un objeto literal. Ahi le podemos añadir lo que queramos, variables, funciones, vectores, etc. En realidad, casi todo en javascript es un objeto, pero ese ya es otro tema.
Por ejemplo, para añadir una funcion a nuestro namespace, marc ha decidido añadirla directamente con la notacion de metodo:
miNamespace.miFuncion = function(){}
No es que sea incorrecto, epro la mayoria de los casos yo prefiero usar funciones literales tambien y dejarlo todo bien indentado, mas que nada por facilidad de lectura:
<code>
var miNamespace = {
miVar : valor,
miVector : [],
miFuncion : fiunction(){},
miFuncion2(arg){},
miFuncion3(arg, arg2){}
}</code>
sole
¿Puedo crear instancias de esos objetos contenedores?
¿Puedo definir objetos dentro de esos contenedores?
(Empieza el momento ralloso xD)
XrV
genial, ahora un namespace más complejo (rollo lo que programa meddle)
miNamespace={
soyguay:function(){
alert("no veaaaaassssss");
},
tuNoEresGuay:function(){
window.status="me rio en tu cara";
}
}
creo que es así :D ostias, como me gusta :D
vale, ahora ... tengo aqi al lado la referencia de DOM i pone una propiedad llamada namespaceURI de la interficie de element. tambien lo tenemos con document y temas como el metodo getAttributeNS.... todo esto se refiere a este tipo de programación?
-- JODER HE LLEGADO TARDE --
meddle
"¿Puedo crear instancias de esos objetos contenedores?"
tal como lo uso yo, no, ese es el problema. un objeto literal tiene unas caracteristicas propias, actua como objeto pero a la vez como instancia, por lo que no puedes instanciarlo.
Pero siemrpe puedes usar otra notacion. Por ejemplo. Mirate el primer enlace de arriba, el de Tom Trenka. Veras que el esta usando el objeto literal para crearse un namespace y luego la notacion que usaba antes marc para crearse una clase. Y entonces ya tienes un scope propio que a la vez te permite usar clases y hacer instancias :)
Yo sinceramente, si a alguien le interesa el js avanzado me leeria toda la documentacion de Tom, es lo mejor que hay actualmente en la red.
"puedo definir objetos dentro de esos contenedores"
Si, de hecho una funcion no es mas que un objeto :)
Marc, nunca he usado lo del namspaceURI. Ni idea.
XrV
sole
¿Puedo crear instancias de esos objetos contenedores?
¿Puedo definir objetos dentro de esos contenedores?
(Empieza el momento ralloso xD)
a lo primero no lo se, que responda meddle XD
a lo segundo, por supuesto XD
ns={
objeto:{},
array:[],
string:"",
integer:10,
bool:false,
funcion:function(){}
}
oye meddle, esto no lo entiendo:
miFuncion : fiunction(){},
miFuncion2(arg){}, <- este
miFuncion3(arg, arg2){} <- este
no tendría que ser
miFuncion2:function(arg){} ¿¿¿¿¿?????
meddle
no, todas las definiciones van separadas por comas, menos la ultima que al ser la ultima no lleva coma ;)
sole
Bien bien, un hilo muy interesante. Esta tarde me lo miro con más detenimiento. A ver si porto el código que tengo hecho a este estilo, o mejor dicho, el que escriba a partir de ahora lo monto con este estilo :)
meddle
me alegro, cualquier otra duda al respecto ya sabe, XrV o meddle al rescate :)
sole
gracias, son ustedes muy amables ;)
XrV
me siento como en casa :)
clkwise
mmm interesante, todo esto. me he colado en el post y esta curioso eso de los namespaces, aunq tirar de cliente para (en este caso JS) no hace peligrar un poco la robustez del documento?
vamos que he visto que se pueden hacer cosillas cañeras pero yo personalmente no me fio mucho de JS. prefiero tirar de server aunq esto seria entrar en una conversacion que puede dar para mucho. claro esta que siempre depende del caso en cuestion.
meddle
No se si te he pillado la pregunta.
Javascript no se puede sustituir con PHP, por ejemplo, ni al revés. Una vez puestos en que tienes que usar js, pues lo mejor es hacerlo bien para que no se mezclen los codigos etc, es decir usando un namespace propio.
sole
100% de acuerdo. Ya que hay q hacerlo, al menos que sea bien, no a lo guarro como se suele hacer en este campo... :(
XrV
se refiere a aplicar estilos etc ... de modo convencional sin usar lenguaje de cliente, todo el tocho, es decir, en lugar de desacargar 12kb te descargas 30kb y te quedas tan ancho XD
meddle
mi aun no entender la pregunta
sole
Bueno pero algunas cosas mola hacerlas en vivo y en directo. Por ejemplo, haces una consulta a la BD y te saca unas filas. Ahora quieres insertar una nueva, pues con DOM creas una fila nueva en la tabla que te muestra los datos, y luego ya lo rellenas y se manda al servidor.
Por poner un ejemplo :)
clkwise
meddle no estoy de acuerdo en que lo que se puede hacer con JS no se puede hacer con PHP y viceversa. hay muchas cosas que se pueden hacer, calcular y demas en el server y bajarlo cargado sin tener al cliente currando. bueno yo se lo que digo aunq mi expresion no es mi fuerte :) pero a lo mejor no caeis en ningun ejemplo.
en general, si puedo encontrar la solucion sin tirar de JS lo prefiero. me da algo de miedo y es bastante lento.(JS) pero claro hay veces que no hay mas tu tia.
y si la verdad es que con JS se tiende a la guarreria. pq sera? aunq todo sea sicho suelo ser un cochino con el codigo y generalmente es por las prisas de entrega (y una vez entregado aunq deberia "limpiarlo" un poco me da una pereza....)