jquery链接如何工作?

我不是问什么是链接的适当的语法,我知道它可能是这样的:

$('myDiv').removeClass('off').addClass('on'); 

不过我真的很好奇,理解它的内部工作,据我所知,链接是其他着名框架的优势之一,但这个我们像一个像我这样的新手程序员的抽象,我肯定有人出来那里可以给我一个解释,让我了解如何链接工程。

谢谢!

如果你有一个具有特定方法的对象,如果每个方法都返回一个包含方法的对象,那么你可以直接从返回的对象中调用一个方法。

 var obj = { // every method returns obj---------v first: function() { alert('first'); return obj; }, second: function() { alert('second'); return obj; }, third: function() { alert('third'); return obj; } } obj.first().second().third(); 

演示: http : //jsfiddle.net/5kkCh/

它所做的只是在方法结束时返回this的引用。 以这个简单的对象为例:

  var sampleObj = function() { }; sampleObj.prototype.Foo = function() { return this; }; 

您可以整天链接这些电话,因为您返回this的引用:

 var obj = new sampleObj(); obj.Foo().Foo().Foo().Foo() // and so on 

jQuery只是执行一个操作,然后返回this

基本上第一个函数调用$('myDiv')返回一个jQuery对象,然后每个后续调用返回相同的一个。

严格地说,

 var $ = function(selector) { return new jQuery(selector); }; jQuery.prototype.removeClass = function(className) { // magic return this; } 
 return $this; 

每个jQuery函数返回一个jQuery类的实例,然后可以调用它的方法。 你可以把它分解,这个代码会有相同的效果。

 jQuery_obj = $('myDiv'); jQuery_obj = jQuery_obj.removeClass('off'); jQuery_obj = jQuery_obj.addClass('on'); 

重点是一个函数必须评估为“父”function。 所以,例如

 foo().bar().test(); 

必须评估:

 foo().test(); 

这样你就可以在foo()上调用另一个函数了。 要做到这一点,你可以return this

 function foo() { // empty, nothing interesting here } foo.prototype.bar = function() { return this; } foo.prototype.test = function() { return this; } 

然后,

 var something = new foo(); something.bar() === something; // true 

正因为如此:

 something.bar().test() === something.test(); // true 

因此,因为something.bar()计算出来的something ,你可以立即调用第二个函数。

在链接父函数/方法返回一个对象,然后由子函数/方法使用,事情就这样。 总之, jQuery$返回本身(一个对象),允许链接。

下面是同样的机制

 var obj=$('input'); //returns jQuery object var obj1=obj.val('a'); //returns jQuery object var obj2=obj1.fadeOut();//returns jQuery object 

它看起来像这样,如果它是与链接

 $('input').val('a').fadeOut(); 

下面是一个条件callback链的例子,就像在$.ajax jQuery函数中使用的一样。

 // conditional callback function example myFunction = function () { // define event callback prototypes without function parameter var callback_f = new Object; callback_f.callback1 = function () { return callback_f; }; callback_f.callback2 = function () { return callback_f; }; if ([condition]){ // redefine the callback with function parameter // so it will run the user code passed in callback_f.ReturnPlayer = function (f) { f(); return callback_f; }; }else{ callback_f.NewPlayer = function (f) { f(); return callback_f; }; } return callback_f; } 

链接的方法之一,检查演示 。

 test("element").f1().f2().f3()