2010-03-19 19 views
5

Si nos fijamos en la última fuente de jQuery en http://code.jquery.com/jquery-latest.js vemos lo siguiente:¿Por qué jQuery hace esto en su implementación de función de constructor?

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

Mi comprensión de la nueva palabra clave en Javascript está esencialmente JavaScript pasa a la función de un objeto vacío {} y la función fija cosas en él a través de this.blah.

También a mi entender new difiere de .call/.apply etc. en que el objeto de retorno también tiene el prototipo configurado para el de la función. Por lo tanto, el valor de retorno debe tener un prototipo que sea el mismo que jQuery.prototype.init.prototype (o jQuery.fn.init.prototype). Sin embargo, por lo que veo, su prototipo está configurado en jQuery.prototype, por lo tanto, todos los comandos disponibles para trabajar en el conjunto.

¿Por qué es esto? ¿Qué me estoy perdiendo en mi comprensión?

Respuesta

1

Si nos fijamos más en jQuery's code, se dará cuenta de esta línea:

// Give the init function the jQuery prototype for later instantiation 
jQuery.fn.init.prototype = jQuery.fn; 

Esto es para facilitar la lectura/estructura por lo que el constructor puede tener su propio método.

No se está haciendo realmente "magia" aquí, solo JavaScript estándar, aunque de una manera ligeramente menos utilizada, tal vez. Es útil en el caso de jQuery ya que la biblioteca es bastante extensa y esto le agrega una buena estructura/legibilidad.

0

En ese archivo fuente, buscar la cadena "Dar la función init el prototipo de jQuery para la instanciación más adelante" :-)

El código establece la referencia de prototypejQuery.fn.init-jQuery.prototype (que es la misma que me jQuery.fn pensar).

Cuestiones relacionadas