jQuery possède une bibliothèque de fonctions stockées dans un objet interne nommé fn
. Ce sont ceux que vous pouvez appeler sur chaque objet jQuery.
Lorsque vous faites $("div.someClass")
vous obtenez un objet jQuery contenant tous les éléments <div>
de cette classe. Maintenant vous pouvez faire $("div.someClass").each(someFunction)
pour appliquer someFunction
à chacun d'entre eux. Cela signifie que each()
est l'une des fonctions stockées dans fn
(a intégré une dans ce cas).
Si vous étendez (ajoutez à) l'objet interne fn
, vous rendez automatiquement disponible votre fonction personnalisée à la même syntaxe. Supposons que vous avez une fonction qui enregistre tous les éléments sur la console, appelée log()
. Vous pouvez ajouter cette fonction à $.fn
, puis l'utiliser en tant que $("div.someClass").log()
.
Chaque fonction jointe à l'objet fn
sera appelé de telle sorte que l'intérieur le corps de la fonction, le mot-clé this
pointera vers l'objet jQuery que vous avez utilisé.
La pratique courante consiste à renvoyer this
à la fin de la fonction personnalisée, afin que le chaînage de méthode ne se casse pas: $("div.someClass").log().each(someFunction)
.
Il existe plusieurs façons d'ajouter des fonctions à l'objet $.fn
, certaines étant plus sûres que d'autres. Un assez sûr est de faire:
jQuery.fn.extend({
foo: function() {
this.each(function() { console.log(this.tagName); });
return this;
}
})
Malheureusement votre exemple n'utilise pas de prototypage du tout. Cela fonctionne parce que dans JavaScript, les fonctions sont des objets de première classe et peuvent être passées et assignées comme n'importe quelle autre variable. – adamnfish
oui, l'objet prototype existe sur les objets déclarés comme tels, il fonctionne de manière similaire. Je pouvais copier/coller à partir du lien inférieur Object.prototype.inObj = 1; fonction A() { this.inA = 2; } A.prototype.inAProto = 3; B.prototype = new A; // Hook up A dans la chaîne prototype de B B.prototype.constructor = B; la fonction B() { this.inB = 4; } B.prototype.inBProto = 5; x = nouveau B; Document.write (x.inObj + ',' + x.inA + ',' + x.inAProto + ',' + x.inB + ',' + x.inBProto); – Benoit