so che sono quasi tre anni di ritardo alla festa, ma si spera che i futuri lettori di questa domanda può beneficiare la mia risposta. La risposta di GSto ha un bell'aspetto dal punto di vista del design di un plug-in jQuery, ma presenta un piccolo problema: chiamare mynamespace()
i clobbers con l'istanza di jQuery restituita con nuovi metodi. Ecco un esempio di che essere 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 risposta scelta non ha questo problema perché c'è amtec()
non è un'istanza jQuery ed è invece un oggetto che chiama i suoi metodi con l'istanza jQuery come contesto. Ho preso i concetti da entrambe le risposte e scritto il plugin spazio dei nomi di seguito:
(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);
Esempio di utilizzo:
$.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
Il codice utilizza alcune belle dettagli di basso livello di JavaScript che sono ben spiegati da John Resig's Advanced JavaScript tutorial, ma in senso lato ciò che sta accadendo in questo esempio è:
Quando milosz
(internamente $.fn[namespaceName]
) è chiamato, this
punti all'istanza jQuery
restituiti b y $('.mydiv')
.Pertanto, l'istruzione if
ricade nel blocco else
e viene richiamata la versione del costruttore di milosz
(indicata internamente come executor
per motivi che stanno per diventare evidenti). Il costruttore riceve un singolo parametro: this
, un puntatore allo jQuery
l'istanza che sarà il contesto di esecuzione per tutti i membri dello spazio dei nomi milosz
. Inseriamo nuovamente l'istruzione if
, questa volta eseguendo il primo blocco, in cui l'istanza jQuery
passata è memorizzata in una variabile membro denominata __context__
(che si spera abbia una bassa possibilità di essere sovrascritta). Viene restituito l'oggetto costruito, completo con un riferimento all'istanza originale jQuery
e qualsiasi wrapper aggiunto al suo prototipo mediante invocazioni di $.namespace
. Questi wrapper eseguono semplicemente i metodi passati nello spazio dei nomi milosz
con l'oggetto originale jQuery
come contesto, come accade quando viene eseguito redify
.
Bah, so che è un boccone, comunque il punto è che funziona come la risposta accettata, ma sembra la risposta jQueryish, che per me è il meglio di entrambi i mondi.
vorresti verificare la mia soluzione. è più preciso a ciò che stai cercando di ottenere. –