Yanıtlar:
JQuery'de, fn
özellik yalnızca mülkün diğer adıdır prototype
.
jQuery
Tanımlayıcı (veya $
) sadece bir yapıcı işlevi ve şantiye prototip devralan onunla oluşturulan tüm örneklerdir.
Basit bir yapıcı işlevi:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
JQuery mimarisine benzeyen basit bir yapı:
(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"
function func1 (a) { ... }
ve bir özellik de burada 'a' değişkeni olacaktır var foo = {}; foo.a = 'a'
.
jQuery.fn
için kısayol tanımlanmıştır jQuery.prototype
. Gönderen kaynak kodu :
jQuery.fn = jQuery.prototype = {
// ...
}
Bu , geçerli jQuery sürümünü döndüren jQuery.fn.jquery
bir diğer jQuery.prototype.jquery
addır. Yine kaynak koddan :
// The current version of jQuery being used
jquery: "@VERSION",
fn
kelimenin tam anlamıyla jquery anlamına gelir prototype
.
Bu kod satırı kaynak kodundadır:
jQuery.fn = jQuery.prototype = {
//list of functions available to the jQuery api
}
Ancak arkasındaki gerçek araç fn
, kendi işlevselliğinizi jQuery'ye bağlamak için kullanılabilirliğidir. Jquery'nin işlevinizin üst kapsamı olacağını unutmayın, bu nedenle this
jquery nesnesine atıfta bulunun.
$.fn.myExtension = function(){
var currentjQueryObject = this;
//work with currentObject
return this;//you can include this if you would like to support chaining
};
İşte bunun basit bir örneği. Biri mavi bir kenarlık yerleştiren ve metni mavi renklendiren iki uzantı yapmak istediğimi ve bunların zincirlenmesini istiyorum.
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;
};
Şimdi bunları böyle bir sınıfa karşı kullanabilirsiniz:
$('.blue').blueBorder().blueText();
(Bunun en iyi farklı sınıf isimleri uygulamak gibi css ile yapıldığını biliyorum, ancak lütfen bunun sadece konsepti göstermek için bir demo olduğunu unutmayın)
Bu cevabın tam teşekküllü bir uzantıya iyi bir örneği var.
each
Örnek kodunuzda atlayamaz mısınız? Alerady elementler üzerinde tekrarladığı için $.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
iyi çalışır .css()
.
css
işlev otomatik olarak her biri ile dahili olarak yinelenir . Bu sadece this
dış nesnenin jquery nesnesi ve iç nesnenin elemanın kendisine referans gösterdiği farkları göstermenin bir örneğiydi .
Elimizdeki jQuery kaynak kodunda jQuery.fn = jQuery.prototype = {...}
beri jQuery.prototype
bir nesne değeri jQuery.fn
basitçe aynı nesneye bir referans olacaktır jQuery.prototype
zaten referanslar.
Bunu onaylamak için jQuery.fn === jQuery.prototype
bunun değerlendirip değerlendirmediğini true
(hangisinin yaptığı) kontrol edebilirsiniz.