我无法理解jQuery的链接的作品。
jQuery("div").attr("id", "_id")
.hide()
.show();
我不喜欢的东西链接,但我不知道它是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;
}
}
}
})();
// Working
fun().start()
.mid()
.last();
如果函数的返回值是具有对象的方法,你可以立即调用该方法。 就那么简单。
既然你回来this
,你回来,以前的方法被调用在同一个对象。 这意味着你所有的相同方法返回一个对象。
想想这样说:
var f = {
foo: function() {
console.log("foo");
return b;
}
};
var b = {
bar: function() {
console.log("bar");
return f;
}
};
在这里,我们有两个对象。
- 所述
f
对象有一个名为方法foo
,返回b
对象。 - 的
b
对象有一个方法称为bar
,返回f
对象。
正因为如此,打完电话后foo
,我们可以称之为bar
,反之亦然。
f.foo().bar().foo().bar(); // etc
但由于f
没有bar
和b
没有foo
,我们永远不能调用相同的方法两次。
但是,如果我们只有一个目标,那有两种方法,而这两种方法总是返回相同的原始对象?
var fb = {
foo: function() {
console.log("foo");
return fb;
},
bar: function() {
console.log("bar");
return fb;
}
};
现在,我们总是返回有两个对象foo
和bar
的方法,所以我们可以调用方法。
fb.foo().bar().bar().bar().foo().foo().bar();
所以,现在唯一的真正区别是,我们正在返回fb
,而不是this
,但它并不重要,因为它们是相同的对象。 上面的代码就可以return this;
它会表现得一样。
如果你想创建对象的多个实例会的问题,但是这是面向对象的技术问题,不是方法链接 。
在return
的每一个功能是一个jQuery对象。 每个jQuery对象将有参考的所有功能,如show/hide
,所以你可以简单的写
jQuery("#myDiv") //returns a jQuery object
.attr("id", "_id") //sets the ID and returns the jQuery object
.hide() //Hides the element with ID myDiv and returns jQuery object
.show(); //show the element with ID myDiv and returns jQuery object
想想看这样的:
var myLib = {
foo: function() {
alert("FOO!");
return this;
},
bar: function() {
alert("BAR!");
return this;
}
}
myLib.foo().bar();
jQuery的不这样做完全一样,但是这是获得一个链接功能的一种方式。 这尤其是一个不存储有关当前对象的信息。
jQuery对象有返回修改后的jQuery对象,允许你调用它的多个方法的方法。
如果我没有记错,jQuery使用一个经典方法链内它的原型有一个例外,它也有一个enhanced
构造在它的init
原型。 下面是一个简单的模式:
function myQuery(elem){
return new myQuery.prototype.init(elem);
};
myQuery.prototype.init = function(elem) { // the constructor "enhanced"
this.elem = elem;
};
// now copy the myQuery prototypes into init.prototype
myQuery.prototype.init.prototype = myQuery.prototype;
// here comes the chainable prototypes:
myQuery.prototype.start = function() {
this.elem.className = 'start';
return this; // returning the instance allows further chaining
};
myQuery.prototype.finish = function() {
this.elem.className = 'finish';
return this;
};
// now use it
myQuery(document.body).start().finish();
链接原型更有效,因为你可以重复使用每个实例的原型方法。 jQuery是经常初始化多次在文档中,如果你每次创建新对象与所有可链接的方法,它会增加不必要的开销和可能的泄漏。
几乎每个jQuery函数也将返回一个jQuery对象。 其结果是,你能每个单独返回的对象上运行的jQuery功能。
通过编写链接代码,不仅节省了时间,而且还提高性能。 不强制计算机寻求并使用特定的节点,在返回的对象上运行比启动另一个实例更为有效。