Estaba mirando jQuery para entender mejor cómo funciona. El constructor básicamente solo llama
new jQuery.fn.init Me preguntaba cuál es el punto de tener el init dentro del prototipo de jQuery. ¿No tendría el mismo propósito definir init() como parte del objeto jQuery?
Básicamente, me gustaría saber por qué la función de inicio de jQuery se encuentra en jQuery.fn.init() y no jQuery.init()
¿Hay gente haciendo esto?:
jQuery('a').eq(0).hide().init('div').slideToggle(); //?EDITAR: Al volver a leer, no creo que esto responda a su pregunta, pero podría ser útil para que alguien comprenda mejor cómo funciona jQuery de todos modos, así que lo dejo.
Lo que sucede es que jQuery() se define como jQuery.fn.init() que es otra forma de decir jQuery.prototype.init() ¡que es la función selectora! Lo que esto significa es que nadie llamaría a jQuery.fn.init() o jQuery.init() porque jQuery() ES .init() .
¿Qué?
Veamos el fragmento de código del que hablas:
// 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 ); },En los comentarios dice exactamente lo que dije, pero más brevemente. Pero esta es solo la copia local de jQuery... sin embargo, si vas a la línea 908 (de la versión 1.4.4) al final de la función autoejecutable verás:
// Expose jQuery to the global object return (window.jQuery = window.$ = jQuery); })(); ... lo que significa que este jQuery local se convierte en el jQuery global. ¿Asi que? Entonces... este jQuery local era en realidad jQuery.fn.init() , ¿verdad? Entonces, ¿qué es init() ? Si observa desde las líneas 100 a la 208, verá que es el método selector. ¿Qué es el método de selección? Es ese método que usas todo el tiempo para encontrar etiquetas, ids, clases... $('#id') , jQuery('.class') , $('ul li a') ... ¡la función selectora!
Entonces, nadie llamaría a jQuery.init('div') porque es una versión detallada de jQuery('div') después de esa asignación. Y recuerde que jQuery.fn es exactamente lo mismo que decir jQuery.prototype , por lo que en realidad todo lo que hace esa parte es asignar .init() como método del prototipo del objeto jQuery . Es decir, un complemento de jQuery.
Uf, eso fue un bocado. Espero que esto tenga sentido, y si alguien tiene alguna corrección en caso de que me haya informado mal en alguna parte de esta larga explicación, hágamelo saber.
$() es una instancia (new $()) es una instancia (new $.fn.init())
La técnica empleada por jQuery es cómo puede lograr esto. $() siempre regresa como si hubiera sido llamado con la new palabra clave. Sin embargo, en lugar de usar un cambio condicional en this referencia dentro de la function jQuery() {...} , usa un objeto de delegado externo en todos los casos. Este objeto delegado externo, jQuery.fn.init() {...} , recibe el prototipo de jQuery para que su 'tipo' de objeto sea de jQuery y que todas sus instancias sean en realidad instancias de jQuery .