Ich verwende jQuery schon seit einiger Zeit, aber es gibt einige API-Implementierungen, die ich wirklich nicht verstehen kann. Der Herausgeber verweist auf den relevanten Quellcode und teilt nun meinen Lernprozess und meine Gewinne mit allen.
Das Folgende wird mit vereinfachtem Code eingeführt und konzentriert sich auf die Implementierungsideen von 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 verpackt seine Interna zunächst in eine anonyme Funktion zur sofortigen Ausführung und macht sie in Zeile 5 der Außenwelt zugänglich
auf
(function(window, undefined){ //内部变量 //对外暴露jQuery:将jQuery绑定在window上面 window.$ = jQuery; })(window); $("div")
Nehmen Sie den $('div')-Aufruf als Beispiel:
Wie aus der zweiten Codezeile ersichtlich ist, verwendet jQuery jQuery.prototype.init, um jQuery-Objekte zu instanziieren. Dies führt jedoch zu einem Problem:
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;
Warum jQuery.prototype.init verwenden, um Objekte zu instanziieren, anstatt jQuery-Funktionen direkt zu verwenden?
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; } }
Eine kurze Analyse der jQuery-Kettenaufrufe und Showwissen Weitere Informationen finden Sie auf der Script House-Website!