2011-01-21 2 views
39

Stavo osservando il jQuery per capire meglio come funziona. In pratica, il costruttore chiama soloAiutare a capire jQuery.fn.init di jQuery Perché è init in fn

new jQuery.fn.init 

Mi chiedevo qual è il punto di avere l'init all'interno del prototipo di jQuery? Non definire lo init() come parte dell'oggetto jQuery ha lo stesso scopo?


In sostanza vorrei sapere perché la funzione init di jQuery si trova a jQuery.fn.init() e non jQuery.init()

ci sono persone che fanno questo:

jQuery('a').eq(0).hide().init('div').slideToggle(); //? 

risposta

47

EDIT: Rileggendo I Non penso che questo risponda alla tua domanda, ma potrebbe essere utile per qualcuno che abbia una migliore comprensione di come funziona jQuery, quindi me ne sto andando.


Che cosa sta succedendo è che jQuery() si definisce come jQuery.fn.init() che è un altro modo per dire jQuery.prototype.init() che è la funzione di selezione! Ciò significa che nessuno chiamerebbe jQuery.fn.init() o jQuery.init() perché jQuery() IS .init()!

Cosa? sguardo

Let il pezzo di codice che stiamo parlando:

// Define a local copy of jQuery 
var jQuery = function(selector, context) { 
     // The jQuery object is actually just the init constructor 'enhanced' 
     return new jQuery.fn.init(selector, context); 
    }, 

Nei commenti si dice proprio quello che ho detto, ma più brevemente. Ma questa è solo la copia locale di jQuery ... però, se si va alla linea 908 (versione 1.4.4) alla fine della funzione self-executing si vedrà:

// Expose jQuery to the global object 
return (window.jQuery = window.$ = jQuery); 

})(); 

.. .questo significa che questo locale jQuery diventa il jQuery globale. Così? Quindi ... questo locale jQuery era in realtà jQuery.fn.init() giusto? Allora, qual è init()? Se guardi dalle righe 100 a 208 vedrai che è il metodo di selezione. Qual è il metodo di selezione? È quel metodo che usi sempre per trovare tag, ID, classi ... $('#id'), jQuery('.class'), $('ul li a') ... la funzione di selezione!

Quindi nessuno chiamerebbe mai jQuery.init('div') perché è una versione prolissa di jQuery('div') dopo quell'assegnazione. E ricorda che lo jQuery.fn è esattamente lo stesso che dire jQuery.prototype quindi tutto ciò che sta facendo è assegnare locome metodo del prototipo dell'oggetto jQuery. OSSIA un plugin jQuery.

Phew, era un boccone. Spero che questo abbia senso, e se qualcuno ha delle correzioni nel caso in cui abbia disinformato in qualsiasi parte di questa lunga spiegazione, per favore fatemelo sapere.

+4

+1 per un semplice sforzo. Quindi c'è qualche ragione particolare per usare il prototipo come ** opposto ** solo sull'oggetto jQuery stesso. È più veloce o qualcosa del genere (non riesco a immaginare che lo sia) –

+1

Non ho una buona risposta a questa domanda, mi dispiace. Posso risolvere una risposta, ma la certezza su questo è al di sopra del mio grado di paga. – mVChr

+1

idem +1. non ho mai veramente capito cosa stesse facendo quel primo pezzo di jquery. grazie, mvchr! – hellatan

7

$() è un instanceof (new $()) è un instanceof (new $.fn.init())

La tecnica impiegata da jQuery è come si può raggiungere questo obiettivo. $() restituisce sempre come se fosse stato chiamato con la parola chiave new.Tuttavia, anziché utilizzare un interruttore condizionale sul riferimento this all'interno di function jQuery() {...}, in tutti i casi viene utilizzato un oggetto delegato esterno. A questo oggetto delegato esterno, jQuery.fn.init() {...}, viene assegnato il prototipo jQuery in modo che il suo oggetto 'tipo' sia jQuery e che tutte le istanze di esso siano effettivamente istanze di jQuery.

+0

Alla luce della risposta fornita da @mVchr, questa risposta è impressionante. Fornisce una definizione verbale di ciò che altrimenti sarebbe un pezzo di codice astruso che sembrerebbe fornire solo ambiguità. Grazie mille! Ma vorrei ancora che tu fossi andato avanti di un miglio o due. Questo è sicuramente la pena almeno un capitolo in un libro. –