2011-09-24 16 views
15

Entiendo el concepto de extender jquery.fn para colocar sus funciones personalizadas en la cadena prototipo de un objeto jquery, pero en mi caso algunos de mis utils no necesitan estar adjuntos a un selector . Básicamente estoy buscando un método estático. Así que quería saber de cualquier trampa de escribir métodos estáticos directamente en el objeto jquery como métodos de utilidad.Escribiendo jquery static util methods

Ejemplo:

jquery.myMethod = function(arg){ 
    ...... 
} 

$.myMethod("blabla"); 

Gracias

Respuesta

15

Como parece darse cuenta, es una buena idea no volcar todas sus funciones de utilidad en el espacio de nombres global. Cuanto menos puedas impactar en el espacio de nombres global, mejor. Si ya tiene jQuery, entonces sus decisiones acerca de qué hacer con ellos son:

  1. Como nuevos métodos en el objeto jQuery como: jQuery.myUtil1(), jQuery.myUtil2().
  2. Como nuevos métodos bajo un objeto en el objeto jQuery como: jQuery.jfUtils.myUtil1(), jQuery.jfUtils.myUtil2().
  3. Como nuevos métodos en un nuevo objeto global (nada que ver con jQuery) como: jfUtils.myUtil1(), jfUtils.myUtil2().

Opción 2) me parece mejor que la opción 1) porque disminuye la posibilidad de colisionar con otras funciones de jQuery aunque agrega una búsqueda adicional para cada llamada de función.

Opción 3) me parece perfectamente aceptable, ya que solo agrega un nuevo elemento al espacio de nombres global, por lo que siempre que el nombre sea razonablemente único, debería estar bien.

Por lo tanto, creo que podría ir con la opción 2) o la opción 3). Opción 2) podría ser un poco más seguro porque conoce el alcance general de lo que está en ese espacio de nombres, pero cualquiera puede funcionar.

+0

Gracias jfriend00, así que realmente es una cuestión de preferencia por lo que suena, además de agregarlo directamente al objeto jquery, tienes que ser más cuidadoso. Es por eso que primero verifiqué el archivo jquery.js para asegurarme de que no hubiera métodos del mismo nombre que estaría agregando. Simplemente parece más limpio agregarlos directamente a jquery namesapce. Pero también veo la protección adicional de agregar otro objeto directamente al espacio de nombres jquery para agregar sus métodos. – Chapsterj

+0

+1 Definitivamente vaya con la opción 2. Realmente no es tan malo escribirlo como $ .util.myMethod() y la protección le ahorrará dolores de cabeza más adelante. Agrupar funciones comunes en espacios de nombres es una buena práctica en cualquier idioma. La excepción es que a menos que decida vincularse a la cadena de manipulación DOM de jQuery. –

5

No debe agregar métodos estáticos para jQuery. No ganas nada intentando hacerlo. El objetivo de extender jQuery es que los objetos jQuery encontrados con cadenas de consulta tengan métodos en ellos. Simplemente está creando una función global, así que simplemente cree un nuevo objeto de nivel superior para mantener sus funciones.

+4

Su afirmación no es del todo cierta. Al poner métodos en el objeto jQuery no se agrega una nueva contaminación del espacio de nombres global o conflictos de espacio de nombres globales y, como tal, puede ser mejor que deshacerse de un montón de nuevas funciones en el espacio de nombres global. Debería asegurarse de no entrar en conflicto con otras funciones de jQuery, pero no correrá ningún riesgo de colisionar con ninguna otra cosa a nivel global. – jfriend00

+2

No veo cómo uno es mejor que el otro: o agregas un nombre al espacio de nombre global, y esperas que no colisione con algo allí, o agregas un nuevo nombre al objeto jQuery y esperas que te pongas chocar con algo allí. Es el mismo problema de cualquier manera, pero al menos al agregar un nombre al espacio de nombres global, usted es el propietario de su nombre de nivel superior, y no confunde el problema al hacer que se vea como algo que proporciona jQuery. –

+0

Como puede ver en mi respuesta, señalé los pros/contra de cada uno. Probablemente dependa del espacio de nombres que creas que se comprende mejor y es menos probable que tenga un conflicto: el espacio de nombres del objeto jQuery o el espacio de nombres global, no hay una sola respuesta correcta. Cualquiera de los dos puede funcionar Estaba señalando en mi comentario que uno podría considerar agregar funciones de utilidad de jQuery al objeto jQuery aunque no sean métodos de objetos jQuery. Hay otras razones para hacerlo. – jfriend00