Je regardais le jQuery pour mieux comprendre comment cela fonctionne. Le constructeur appelle simplement
new jQuery.fn.init
Je me demandais quel est l'intérêt d'avoir l'init dans le prototype de jQuery? La définition de init()
en tant que partie de l'objet jQuery lui-même ne servirait-elle pas le même objectif?
Fondamentalement, je voudrais savoir pourquoi la fonction init de jQuery est située dans jQuery.fn.init()
et non jQuery.init()
Y a-t-il des gens qui font ça:
jQuery('a').eq(0).hide().init('div').slideToggle(); //?
EDIT: À la relecture, je ne pense pas que cela réponde à votre question, mais cela pourrait être utile pour que quelqu'un comprenne mieux comment jQuery fonctionne de toute façon, donc je le laisse.
Ce qui se passe, c'est que jQuery()
est définie comme jQuery.fn.init()
qui est une autre façon de dire jQuery.prototype.init()
qui est la fonction de sélection! Cela signifie que personne n'appellerait jQuery.fn.init()
ou jQuery.init()
parce que jQuery()
IS .init()
!
Quelle?
Regardons le morceau de code dont vous parlez:
// 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 );
},
Dans les commentaires, il dit exactement ce que j'ai dit, mais plus brièvement. Mais ce n'est que la copie locale de jQuery ... cependant, si vous passez à la ligne 908 (de la version 1.4.4) à la fin de la fonction auto-exécutable, vous verrez:
// Expose jQuery to the global object
return (window.jQuery = window.$ = jQuery);
})();
... ce qui signifie que ce jQuery
local devient le jQuery
global. Donc? Donc ... ce jQuery
local était en fait jQuery.fn.init()
non? Alors, qu'est-ce que init()
? Si vous regardez des lignes 100 à 208, vous verrez que c'est la méthode de sélection. Quelle est la méthode de sélection? C'est cette méthode que vous utilisez tout le temps pour trouver des balises, des identifiants, des classes ... $('#id')
, jQuery('.class')
, $('ul li a')
... la fonction sélecteur!
Ainsi, personne n'appellera jamais jQuery.init('div')
car c'est une version détaillée de jQuery('div')
après cette affectation. Et rappelez-vous que jQuery.fn
Est exactement la même chose que dire jQuery.prototype
Donc tout ce que cette partie fait est d'affecter .init()
comme méthode du prototype du jQuery
objet. C'EST À DIRE. un plugin jQuery.
Ouf, c'était une bouchée. J'espère que cela a du sens, et si quelqu'un a des corrections au cas où je me serais mal informé dans une partie de cette longue explication, faites-le moi savoir.
$()
est une instance de (new $())
est une instance de (new $.fn.init())
La technique employée par jQuery est de savoir comment vous pouvez y parvenir. $()
renvoie toujours comme si elle était appelée avec le mot clé new
. Cependant, au lieu d'utiliser un commutateur conditionnel sur la référence this
dans function jQuery() {...}
, il utilise un objet délégué externe dans tous les cas. Cet objet délégué externe, jQuery.fn.init() {...}
, reçoit le prototype jQuery de sorte que son 'type' d'objet soit de jQuery
, et que toutes ses instances soient en fait des instances de jQuery
.