Di jQuery, fn
properti hanyalah alias ke prototype
properti.
The jQuery
identifier (atau $
) hanya fungsi konstruktor , dan semua contoh dibuat dengan itu, mewarisi dari prototipe konstruktor.
Fungsi konstruktor sederhana:
function Test() {
this.a = 'a';
}
Test.prototype.b = 'b';
var test = new Test();
test.a; // "a", own property
test.b; // "b", inherited property
Struktur sederhana yang menyerupai arsitektur 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
untuk memungkinkan chaining , jadi Anda bisa melakukannyafoo("bar").myPlugin().otherPlugin()
function func1 (a) { ... }
, dan properti akan menjadi variabel 'a' di sinivar foo = {}; foo.a = 'a'
.jQuery.fn
didefinisikan singkatan untukjQuery.prototype
. Dari kode sumber :Itu berarti
jQuery.fn.jquery
alias untukjQuery.prototype.jquery
, yang mengembalikan versi jQuery saat ini. Lagi dari kode sumber :sumber
fn
secara harfiah mengacu pada jqueryprototype
.Baris kode ini ada dalam kode sumber:
Tetapi alat yang sebenarnya di belakang
fn
adalah ketersediaannya untuk menghubungkan fungsionalitas Anda sendiri ke jQuery. Ingatlah bahwa jquery akan menjadi lingkup induk untuk fungsi Anda, jadithis
akan merujuk ke objek jquery.Jadi di sini adalah contoh sederhana dari itu. Katakanlah saya ingin membuat dua ekstensi, satu yang menempatkan batas biru, dan yang warna teks biru, dan saya ingin mereka dirantai.
jsFiddle Demo
Sekarang Anda bisa menggunakan itu terhadap kelas seperti ini:
(Saya tahu ini paling baik dilakukan dengan css seperti menerapkan nama kelas yang berbeda, tapi harap diingat ini hanya demo untuk menunjukkan konsepnya)
Jawaban ini memiliki contoh bagus tentang ekstensi penuh.
sumber
each
kode contoh Anda?$.fn.blueBorder = function(){ this.css("border","solid blue 2px"); return this; };
akan bekerja dengan baik, seperti yang.css()
disebutkan di atas elemen.css
fungsi akan secara otomatis beralih ke mereka secara internal dengan masing-masing. Itu hanya contoh menunjukkan perbedaan dithis
mana yang luar adalah objek jquery dan yang dalam referensi elemen itu sendiri.Dalam kode sumber jQuery yang kita miliki
jQuery.fn = jQuery.prototype = {...}
sejak itujQuery.prototype
adalah sebuah objek nilaijQuery.fn
hanya akan menjadi referensi ke objek yang sama yangjQuery.prototype
sudah referensi.Untuk mengonfirmasi ini, Anda dapat memeriksa
jQuery.fn === jQuery.prototype
apakah yang mengevaluasitrue
(yang ia lakukan) maka mereka merujuk objek yang samasumber