En jQuery, la fn
propiedad es solo un alias de la prototype
propiedad.
El jQuery
identificador (o $
) es solo una función de constructor , y todas las instancias creadas con él, heredan del prototipo del constructor.
Una función constructora simple:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
Una estructura simple que se asemeja a la arquitectura de jQuery:
(function() {
var foo = function(arg) { // core constructor
// ensure to use the `new` operator
if (!(this instanceof foo))
return new foo(arg);
// store an argument for this example
this.myArg = arg;
//..
};
// create `fn` alias to `prototype` property
foo.fn = foo.prototype = {
init: function () {/*...*/}
//...
};
// expose the library
window.foo = foo;
})();
// Extension:
foo.fn.myPlugin = function () {
alert(this.myArg);
return this; // return `this` for chainability
};
foo("bar").myPlugin(); // alerts "bar"
return this
para permitir el encadenamiento , para que puedas hacerlofoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
, y una propiedad sería la variable 'a' aquívar foo = {}; foo.a = 'a'
.jQuery.fn
se define como taquigrafía parajQuery.prototype
. Del código fuente :Eso significa que
jQuery.fn.jquery
es un alias parajQuery.prototype.jquery
, que devuelve la versión actual de jQuery. De nuevo desde el código fuente :fuente
fn
literalmente se refiere al jqueryprototype
.Esta línea de código está en el código fuente:
Pero la verdadera herramienta detrás
fn
es su disponibilidad para conectar su propia funcionalidad a jQuery. Recuerde que jquery será el ámbito principal de su función, por lo quethis
se referirá al objeto jquery.Así que aquí hay un ejemplo simple de eso. Digamos que quiero hacer dos extensiones, una que pone un borde azul y que colorea el texto de azul, y quiero encadenarlas.
jsFiddle Demo
Ahora puedes usarlos contra una clase como esta:
(Sé que esto se hace mejor con CSS, como aplicar diferentes nombres de clase, pero tenga en cuenta que esto es solo una demostración para mostrar el concepto)
Esta respuesta tiene un buen ejemplo de una extensión completa.
fuente
each
código de ejemplo?$.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
funcionaría bien, ya que.css()
alerady itera sobre los elementos.css
función iterará automáticamente sobre ellos internamente con cada uno. Fue solo un ejemplo de mostrar las diferencias enthis
donde el externo es el objeto jquery y el interno hace referencia al elemento mismo.En el código fuente de jQuery que tenemos,
jQuery.fn = jQuery.prototype = {...}
ya quejQuery.prototype
es un objeto, el valor dejQuery.fn
será simplemente una referencia al mismo objeto quejQuery.prototype
ya hace referencia.Para confirmar esto, puede verificar
jQuery.fn === jQuery.prototype
si eso evalúatrue
(lo que hace) y luego hacen referencia al mismo objetofuente