我无法理解jQuery链是如何工作的

Kri*_*mar 1 javascript jquery unobtrusive-javascript javascript-framework

我无法理解jQuery链是如何工作的.

jQuery("div").attr("id", "_id")
    .hide()
    .show();
Run Code Online (Sandbox Code Playgroud)

我做了类似链接的事情,但我不确定它是否与jQuery使用的逻辑相同.

var fun = (function (parma) {
return function () {
    return {
        start: function () {
            console.log("start");
            return this;
        },

        mid: function () {
            console.log("mid");
            return this;
        },

        last: function () {
            console.log("last");
            return this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

})();

// Working
fun().start()
    .mid()
    .last();
Run Code Online (Sandbox Code Playgroud)

I H*_*azy 5

如果函数的返回值是具有方法的对象,则可以立即调用该方法.就那么简单.

由于您正在返回this,因此您将返回与调用上一个方法相同的对象.这意味着您将使用所有相同的方法返回一个对象.


想一想:

var f = {
    foo: function() {
             console.log("foo");
             return b;
         }
};

var b = {
    bar: function() {
             console.log("bar");
             return f;
         } 
};
Run Code Online (Sandbox Code Playgroud)

这里我们有两个对象.

  • f对象有一个foo返回该b对象的方法.
  • b对象有一个bar返回该f对象的方法.

因此,在打电话之后foo,我们可以打电话bar,反之亦然.

f.foo().bar().foo().bar(); // etc
Run Code Online (Sandbox Code Playgroud)

但是因为f没有barb没有foo,我们永远不能两次调用相同的方法.


但是如果我们只有一个对象,有两个方法,并且两个方法总是返回相同的原始对象呢?

var fb = {
    foo: function() {
             console.log("foo");
             return fb;
         },
    bar: function() {
             console.log("bar");
             return fb;
         }
};
Run Code Online (Sandbox Code Playgroud)

现在我们总是返回一个包含foobar方法的对象,因此我们可以调用任一方法.

fb.foo().bar().bar().bar().foo().foo().bar();
Run Code Online (Sandbox Code Playgroud)

所以现在唯一真正的区别是我们正在返回fb而不是this,但它并不重要,因为它们是同一个对象.上面的代码可以做return this;,它会表现相同.

如果你想创建对象的几个实例,这很重要,但这是一个面向对象技术的问题,而不是方法链.