jQuery tiene una biblioteca de funciones almacenadas en un objeto interno llamado fn
. Estos son los que puede invocar en cada objeto jQuery.
Cuando hace $("div.someClass")
obtiene un objeto jQuery que contiene todos los elementos <div>
de esa clase. Ahora puede hacer $("div.someClass").each(someFunction)
para aplicar someFunction
a cada uno de ellos. Esto significa que each()
es una de las funciones almacenadas en fn
(una incorporada en este caso).
Si amplía (agrega) el objeto interno fn
, automáticamente habilita su función personalizada con la misma sintaxis. Supongamos que tiene una función que registra todos los elementos en la consola, llamada log()
. Puede agregar esta función al $.fn
, y luego usarla como $("div.someClass").log()
.
Cada función anexa al objeto fn
serán llamados de una manera tal que dentro del cuerpo de la función, la palabra clave this
apuntará al objeto jQuery que ha utilizado.
La práctica común es devolver this
al final de la función personalizada, para que el método de encadenamiento no se rompa: $("div.someClass").log().each(someFunction)
.
Hay varias formas de agregar funciones al objeto $.fn
, algunas más seguras que otras. Una muy segura es hacer:
jQuery.fn.extend({
foo: function() {
this.each(function() { console.log(this.tagName); });
return this;
}
})
Desafortunadamente su ejemplo no usa prototipos en absoluto. Esto funciona porque en JavaScript, las funciones son objetos de primera clase y se pueden pasar y asignar como cualquier otra variable. – adamnfish
sí, el objeto prototipo existe en objetos declarados como tales, funciona de manera similar. Pude copiar/pegar desde el enlace inferior Object.prototype.inObj = 1; función A() { this.inA = 2; } A.prototype.inAProto = 3; B.prototype = new A; // Conecta A a la cadena prototipo de B B.prototype.constructor = B; función B() { this.inB = 4; } B.prototype.inBProto = 5; x = nuevo B; document.write (x.inObj + ',' + x.inA + ',' + x.inAProto + ',' + x.inB + ',' + x.inBProto); – Benoit