Sé que estoy casi tres años tarde a la fiesta, pero espero que los futuros lectores de esta pregunta se pueden beneficiar de mi respuesta. La respuesta por GSto se ve muy bien desde el punto de vista del diseño de un plugin jQuery, pero tiene un pequeño problema: llamar al mynamespace()
corta la instancia de jQuery devuelta con nuevos métodos. Aquí es un ejemplo de que sea un problema:
$myDiv = $('.mydiv');
$myDiv.mynamespace().height(); // this will be `height' from mynamespace
$myDiv.height(); // this will STILL be `height' from mynamespace
// because it has overwritten $myDiv.height
La respuesta elegida no tiene este problema porque hay amtec()
no es una instancia de jQuery y es en cambio un objeto que llama a sus métodos con el ejemplo jQuery como contexto. He tomado los conceptos de ambas respuestas y escrito el plugin espacio de nombres a continuación:
(function($) {
$.namespace = function(namespaceName, closures) {
if ($.fn[namespaceName] === undefined) {
$.fn[namespaceName] = function executor(context) {
if (this instanceof executor) {
this.__context__ = context;
}
else {
return new executor(this);
}
};
}
$.each(closures, function(closureName, closure) {
$.fn[namespaceName].prototype[closureName] = function() {
return closure.apply(this.__context__, arguments);
};
});
};
})(jQuery);
Ejemplo de uso:
$.namespace('milosz', {
redify: function() {
$(this).css('color', '#ff0000');
},
greenify: function() {
$(this).css('color', '#00ff00');
}
});
$.namespace('milosz', {
blueify: function() {
$(this).css('color', '#0000ff');
}
});
$('.mydiv').milosz().redify(); // The HTML elements with class `mydiv' are now red
El código utiliza algunos detalles bonitos de bajo nivel de JavaScript que están bien explicadas por John Resig's Advanced JavaScript tutorial, pero hablando vagamente lo que está sucediendo en el ejemplo es la siguiente:
Cuando se llama milosz
(internamente $.fn[namespaceName]
), this
apunta a la jQuery
ejemplo volvieron b y $('.mydiv')
.Por lo tanto, la instrucción if
cae al bloque else
y se llama a la versión de constructor de milosz
(referida internamente como executor
por razones que están a punto de hacerse evidentes). Al constructor se le pasa un único parámetro: this
, un puntero al jQuery
la instancia que va a ser el contexto de ejecución para todos los miembros del espacio de nombres milosz
. Volvemos a ingresar a la instrucción if
, esta vez ejecutando el primer bloque, donde la instancia jQuery
que se ha pasado al pasado se almacena en una variable miembro llamada __context__
(que con suerte tiene pocas posibilidades de sobrescribirse). Se devuelve el objeto construido, completo con una referencia a la instancia original jQuery
y cualquier envoltorio agregado a su prototipo mediante invocaciones de $.namespace
. Estos contenedores simplemente ejecutan los métodos pasados en el espacio de nombres milosz
con el objeto original jQuery
como contexto, como ocurre cuando se ejecuta redify
.
Bah, sé que es un bocado, de todos modos el punto es que funciona como la respuesta aceptada, pero se parece a la respuesta jQueryish, que para mí es lo mejor de ambos mundos.
por favor, echa un vistazo a mi solución. es más preciso para lo que estás tratando de lograr. –