jquery 链接是如何工作的?

IT技术 javascript jquery frameworks
2021-02-05 20:15:20

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

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

但是,我真的很想了解它的内部工作原理,据我所知,链接是与其他著名框架相比的优势之一,但这对于像我这样的新手程序员来说是非常抽象的,我相信有人可以那里可以为我提供一个解释,让我了解链接是如何工作的。

谢谢!

6个回答

如果你有一个带有某些方法的对象,如果每个方法返回一个带有方法的对象,你可以简单地从返回的对象中调用一个方法。

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/

我喜欢这个例子,让它更简单..谢谢
2021-03-12 20:15:20
@Derek:您可以这样做,因为this在示例中的函数中,每个方法都将成为调用的对象。
2021-03-25 20:15:20
@Derek朕会功夫我认为,人谁是新儿给JavaScript这样做(返回给一个变量,而不是一个参考的@squint答案的方式this)更加清晰,因为var that = this似乎把人关在我的经验,想学习编程,他们认为这很难。但我认为你的建议更清楚,因为它使你如何实施多个“深度”链变得更加明显
2021-03-26 20:15:20
像数组一样访问如何工作,$('a')[0]给出第一个元素
2021-04-06 20:15:20
而不是return obj,你能说return this吗?因为我测试过,它给了我相同的结果。
2021-04-08 20:15:20

它所做的只是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;
}
我发现这比公认的答案更能解释它的工作原理。
2021-04-06 20:15:20
return $this;

每个 jQuery 函数都返回一个 jQuery 类的实例,然后可以在其上调用方法。你可以分解它,这段代码会产生同样的效果。

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

关键是函数必须评估为“父”函数。所以例如

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,您可以立即一次性调用第二个函数。