Respostas:
No jQuery, a fn
propriedade é apenas um alias para a prototype
propriedade.
O jQuery
identificador (ou $
) é apenas uma função do construtor e todas as instâncias criadas com ele herdam do protótipo do construtor.
Uma simples função construtora:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
Uma estrutura simples que se assemelha à arquitetura do 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 o encadeamento , assim que você poderia fazerfoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
e uma propriedade seria a variável 'a' aqui var foo = {}; foo.a = 'a'
.
jQuery.fn
é definido como abreviação para jQuery.prototype
. Do código fonte :
jQuery.fn = jQuery.prototype = {
// ...
}
Isso significa que jQuery.fn.jquery
é um alias para jQuery.prototype.jquery
, que retorna a versão atual do jQuery. Novamente a partir do código fonte :
// The current version of jQuery being used
jquery: "@VERSION",
fn
literalmente se refere ao jquery prototype
.
Esta linha de código está no código fonte:
jQuery.fn = jQuery.prototype = {
//list of functions available to the jQuery api
}
Mas a ferramenta real fn
é a disponibilidade para conectar sua própria funcionalidade ao jQuery. Lembre-se de que jquery será o escopo pai da sua função, portanto, this
se referirá ao objeto jquery.
$.fn.myExtension = function(){
var currentjQueryObject = this;
//work with currentObject
return this;//you can include this if you would like to support chaining
};
Então, aqui está um exemplo simples disso. Digamos que eu quero fazer duas extensões, uma que coloque uma borda azul e que colore o texto em azul, e eu as quero encadeadas.
jsFiddle Demo
$.fn.blueBorder = function(){
this.each(function(){
$(this).css("border","solid blue 2px");
});
return this;
};
$.fn.blueText = function(){
this.each(function(){
$(this).css("color","blue");
});
return this;
};
Agora você pode usá-los contra uma classe como esta:
$('.blue').blueBorder().blueText();
(Eu sei que isso é melhor feito com css, como a aplicação de nomes de classe diferentes, mas lembre-se de que é apenas uma demonstração para mostrar o conceito)
Esta resposta tem um bom exemplo de uma extensão completa.
each
código de exemplo? $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
funcionaria bem, pois .css()
alerady itera sobre os elementos.
css
função iterará automaticamente sobre eles internamente com cada um. Foi apenas um exemplo de mostrar as diferenças de this
onde o externo é o objeto jquery e o interno faz referência ao próprio elemento.
No código-fonte jQuery que temos jQuery.fn = jQuery.prototype = {...}
desde então, jQuery.prototype
é um objeto cujo valor jQuery.fn
será simplesmente uma referência ao mesmo objeto que jQuery.prototype
já faz referência.
Para confirmar isso, você pode verificar jQuery.fn === jQuery.prototype
se isso avalia true
(o que faz), em seguida, eles fazem referência ao mesmo objeto