2011-01-21 21 views
39

Estaba revisando el jQuery para comprender mejor cómo funciona? El constructor básicamente solo llama aAyuda a comprender el jQuery.fn.init de jQuery ¿Por qué está init en fn

new jQuery.fn.init 

Me preguntaba ¿de qué sirve tener el init dentro del prototipo de jQuery? ¿La definición de init() como parte del objeto jQuery no tiene el mismo propósito?


Básicamente me gustaría saber por qué la función init del jQuery se encuentra en jQuery.fn.init() y no jQuery.init()

¿Hay personas que hacen esto:

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

Respuesta

47

EDIT: Al volver a leer I 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 está sucediendo es que jQuery() se está definiendo como jQuery.fn.init() que es otra forma de decir jQuery.prototype.init() que es la función de selección! Lo que esto significa es que nadie llamaría a jQuery.fn.init() o jQuery.init() porque jQuery() ES .init()!

¿Qué? mirada

Vamos en el trozo de código que estamos hablando:

// 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 que dice justo lo que dije, pero más brevemente. Pero esto es sólo 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á:

// 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 local jQuery era realmente jQuery.fn.init() derecho? Entonces, ¿qué es init()? Si miras desde las líneas 100 a 208, verás que es el método selector. ¿Cuál es el método del selector? Es ese método que usa todo el tiempo para buscar etiquetas, identificadores, clases ... $('#id'), jQuery('.class'), $('ul li a') ... ¡la función de selector!

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 realmente todo lo que hace es asignar .init() como un método del prototipo del objeto jQuery. ES DECIR. un plugin jQuery.

Puf, eso fue un bocado. Espero que esto tenga sentido, y si alguien tiene alguna corrección en caso de que haya informado mal en alguna parte de esta larga explicación, por favor avíseme.

+4

+1 por solo un gran esfuerzo. Entonces, ¿hay alguna razón en particular para usar el prototipo como ** opuesto ** a solo en el objeto jQuery en sí mismo? ¿Es más rápido o algo así? (No me lo puedo imaginar) –

+1

No tengo una buena respuesta a esa pregunta, lo siento. Puedo hackear una respuesta, pero la certeza sobre esta es superior a mi grado de pago. – mVChr

+1

ídem +1. Nunca entendí realmente lo que estaba haciendo el primer bit fo jquery. gracias, mvchr! – hellatan

7

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

La técnica empleada por jQuery es cómo se puede lograr esto. $() siempre vuelve como si se llamara con la palabra clave new.Sin embargo, en lugar de utilizar un interruptor condicional en la referencia this dentro de function jQuery() {...}, utiliza un objeto delegado externo en todos los casos. Este objeto de delegado externo, jQuery.fn.init() {...}, recibe el prototipo de jQuery para que su objeto 'tipo' sea jQuery y todas las instancias sean en realidad instancias de jQuery.

+0

A la luz de la respuesta proporcionada por @mVchr, esta respuesta es impresionante. Proporciona una definición verbal de lo que de otra manera sería una pieza abstrusa de código que parecería proporcionar solo ambigüedad. ¡Muchas gracias! Pero aun así desearía que hubieras avanzado una o dos millas más. Esto definitivamente vale al menos un capítulo en un libro. –

Cuestiones relacionadas