Saya telah menggunakan jQuery untuk seketika, tetapi terdapat beberapa pelaksanaan API yang saya benar-benar tidak dapat memahami. Editor merujuk kepada kod sumber yang berkaitan dan kini berkongsi proses pembelajaran dan keuntungan saya dengan semua orang.
Perkara berikut akan diperkenalkan menggunakan kod yang dipermudahkan, memfokuskan pada idea pelaksanaan jQuery~>_<~
//匿名立即执行函数 //.防止污染全局空间 //.选择性保护内部变量 (function(window, undefined){ //第二参数undefined设置而不传的原因: // 外部发生这种情况:var undefined = 时,undefined会被篡改 // 设置第二参数而不传,则undefined就会被重置回原来值 function jQuery(sel){ return new jQuery.prototype.init(sel); } jQuery.prototype = { constructor: jQuery, init: function(sel){ if(typeof sel === 'string'){ var that = this; //jQuery内部使用的是Sizzle,这里使用querySelectorAll替代 var nodeList = document.querySelectorAll(sel); Array.prototype.forEach.call(nodeList, function(val, i){ that[i] = val; }) this.selector = sel; this.length = nodeList.length; } } } jQuery.prototype.init.prototype = jQuery.prototype; //对外暴露jQuery:将jQuery绑定在window上面 window.$ = jQuery; })(window);
-------------------------
jQuery pada mulanya membungkus bahagian dalamannya dengan fungsi pelaksanaan segera tanpa nama dan mendedahkannya kepada dunia luar pada baris 5;
(function(window, undefined){ //内部变量 //对外暴露jQuery:将jQuery绑定在window上面 window.$ = jQuery; })(window); $("div")
Ambil panggilan $('div') sebagai contoh:
Seperti yang dapat dilihat dari baris kedua kod, jQuery menggunakan jQuery.prototype.init untuk membuat instantiate objek jQuery, tetapi ini akan menyebabkan masalah:
function jQuery(sel){ return new jQuery.prototype.init(sel); } jQuery.prototype = { constructor: jQuery, init: function(sel){ if(typeof sel === 'string'){ var that = this; //jQuery内部使用的是Sizzle,这里使用querySelectorAll替代 var nodeList = document.querySelectorAll(sel); Array.prototype.forEach.call(nodeList, function(val, i){ that[i] = val; }) this.selector = sel; this.length = nodeList.length; } } } jQuery.prototype.init.prototype = jQuery.prototype;
Mengapa menggunakan jQuery.prototype.init untuk membuat instantiate objek dan bukannya menggunakan fungsi jQuery secara langsung?
init: function(sel){ if(typeof sel === 'string'){ var that = this; //jQuery内部使用的是Sizzle,这里使用querySelectorAll替代 var nodeList = document.querySelectorAll(sel); Array.prototype.forEach.call(nodeList, function(val, i){ that[i] = val; }) this.selector = sel; this.length = nodeList.length; } }
Analisis ringkas tentang panggilan berantai jQuery dan menunjukkan pengetahuan Untuk mendapatkan maklumat lanjut, sila perhatikan tapak web Script House!