基本对象/函数链接在javascript中是如何工作的?
我试图在脑海中清楚地了解jQuery风格函数链接的原理。我的意思是:基本对象/函数链接在javascript中是如何工作的?,javascript,methods,chaining,method-chaining,Javascript,Methods,Chaining,Method Chaining,我试图在脑海中清楚地了解jQuery风格函数链接的原理。我的意思是: var e = f1('test').f2().f3(); 我已经有了一个成功的例子,而另一个没有。我会把这些贴在下面。我总是想学习一些事情如何运作的基本原理,这样我就可以在它的基础上继续发展。到目前为止,我对链接的工作原理只有一个粗略而松散的理解,我遇到了一些无法智能地排除的错误 据我所知: 函数必须返回它们自己,也就是“返回这个” 可链接函数必须位于父函数中,即jQuery中的.css()是jQuery()的子方法,因此
var e = f1('test').f2().f3();
我已经有了一个成功的例子,而另一个没有。我会把这些贴在下面。我总是想学习一些事情如何运作的基本原理,这样我就可以在它的基础上继续发展。到目前为止,我对链接的工作原理只有一个粗略而松散的理解,我遇到了一些无法智能地排除的错误
据我所知:
var one = function(num){
this.oldnum = num;
this.add = function(){
this.oldnum++;
return this;
}
if(this instanceof one){
return this.one;
}else{
return new one(num);
}
}
var test = one(1).add().add();
但这一条没有:
var gmap = function(){
this.add = function(){
alert('add');
return this;
}
if(this instanceof gmap) {
return this.gmap;
} else{
return new gmap();
}
}
var test = gmap.add();
在JavaScript中,函数是第一类对象。定义函数时,它是该函数对象的构造函数。换言之:
var gmap = function() {
this.add = function() {
alert('add');
return this;
}
this.del = function() {
alert('delete');
return this;
}
if (this instanceof gmap) {
return this.gmap;
} else {
return new gmap();
}
}
var test = new gmap();
test.add().del();
通过分配新的gmap();对于变量测试,您现在构建了一个新对象,该对象“继承”了gmap()构造函数(类)的所有属性和方法。如果运行上面的代码段,您将看到“添加”和“删除”的警报
new gmap();
在上面的示例中,“this”指的是窗口对象,除非将函数包装到另一个函数或对象中
起初,链接对我来说很难理解,至少对我来说是这样,但一旦我理解了它,我就意识到它是一个多么强大的工具。遗憾的是,直接的答案必须是“不”。即使您可以覆盖现有的方法(在许多UAs中可能可以覆盖,但我怀疑在IE中不能覆盖),您仍然会遇到令人讨厌的重命名:
HTMLElement.prototype.setAttribute = function(attr) {
HTMLElement.prototype.setAttribute(attr) //uh-oh;
}
您最好使用不同的名称:
HTMLElement.prototype.setAttr = function(attr) {
HTMLElement.prototype.setAttribute(attr);
return this;
}
要“重写”函数,但仍能使用原始版本,必须首先将原始函数指定给其他变量。假设一个示例对象:
function MyObject() { };
MyObject.prototype.func1 = function(a, b) { };
要为链接性重写func1
,请执行以下操作:
MyObject.prototype.std_func1 = MyObject.prototype.func1;
MyObject.prototype.func1 = function(a, b) {
this.std_func1(a, b);
return this;
};
这是一个例子。您只需要在所有您认为需要可链接性的标准对象上使用此技术
当您完成所有这些工作时,您可能会意识到有更好的方法来完成您正在尝试的工作,比如使用一个内置了可链接性的库*cough**cough*只需将该方法调用为var test=gmap().add()
由于gmap是一个函数而不是一个变量,首先,请允许我声明,我将用自己的话对此进行解释 方法链接实际上是调用另一个函数/方法返回的对象的方法。例如(使用jquery): 这个jquery函数选择并返回一个jquery对象,即id为demo的DOM元素。如果元素是一个文本节点(element),我们可以链接到返回的对象的方法。例如:
$('#demo').text('Some Text');
因此,只要函数/方法返回对象,就可以将返回对象的方法链接到原始语句
至于为什么后者不起作用,请注意何时何地使用关键字this
。这很可能是一个背景问题。调用this
时,请确保this
引用的是该函数对象本身,而不是窗口对象/全局范围
希望这会有所帮助。函数不会自行返回,而是返回支持链接方法的对象。在jQuery的情况下,它是正在操作的节点。让每个函数以
结尾,并返回此值代码>。要想使现有方法可链接,您可以尝试以下方法:related:看起来我将坚持使用jQuery进行链接!请注意,这个答案是这样的,因为add
不是在gmap()
上定义的,而是只在new gmap()
上定义的。我想如果。。。否则…
,这对我来说没什么意义。默认情况下,构造函数返回此
,也可以显式返回。我相信this.gmap
将是未定义的,而new gmap()
将使构造函数永远循环,所以我不知道为什么它对OP有效。
$('#demo').text('Some Text');