基本的对象/函数链接如何在JavaScript中工作?
我试图得到在我头上直接做jQuery风格函数链接的原则。 我的意思是:
var e = f1('test').f2().f3();
我有一个例子可以工作,而另一个则不行。 我会在后面发表。 我总是想学习如何工作的第一个原则基础,以便我可以build立在它之上。 到目前为止,我只是粗略的理解链接是如何工作的,而且我遇到了一些我无法进行智能排查的错误。
我知道的:
- 函数必须返回自己,也就是“返回这个”。
- 可连接函数必须驻留在父函数中,也就是jQuery中.css()是jQuery()的子方法,因此jQuery().css();
- 父函数应该返回自己或者自己的新实例。
这个例子工作:
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();
到variablestesting你现在已经构build了一个新的对象,它从gmap()构造函数(类)inheritance了所有的属性和方法。 如果您运行上面的代码段,则会看到“添加”和“删除”的提示。
在上面的示例中,“this”指的是窗口对象,除非将函数包装在另一个函数或对象中。
链接起初对我来说很难理解,至less对于我来说是这样,但是一旦我理解了,我就意识到它可以是一个多么强大的工具。
可悲的是,直接的答案是“不”。 即使你可以重写现有的方法(你可能在许多UA中,但我怀疑不能在IE中),你仍然会被困在重要的命令中:
HTMLElement.prototype.setAttribute = function(attr) { HTMLElement.prototype.setAttribute(attr) //uh-oh; }
你可能最好的办法就是使用不同的名字:
HTMLElement.prototype.setAttr = function(attr) { HTMLElement.prototype.setAttribute(attr); return this; }
要“重写”一个函数,但仍然能够使用原始版本,必须先将原始函数分配给一个不同的variables。 假设一个例子对象:
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; };
这是一个工作的例子 。 你只需要在你感觉需要可链接性的所有标准对象上使用这种技术。
当你完成所有这些工作的时候,你可能会意识到有更好的方法来完成你想要做的事情,比如使用已经具有链接性的库。 *咳嗽* jQuery *咳嗽*
首先,让我说我用我自己的话来解释这个。
方法链接几乎是调用另一个函数/方法返回的对象的方法。 例如(使用jQuery):
$('#demo');
这个jquery函数select并返回一个jquery对象与id演示的DOM元素。 如果元素是文本节点(元素),我们可以链接返回的对象的方法。 例如:
$('#demo').text('Some Text');
所以,只要函数/方法返回一个对象,就可以将返回对象的方法链接到原始语句。
至于为什么后者不起作用,请注意使用关键字的位置和时间。 这很可能是一个背景问题。 当你调用this
函数的时候,确保this
函数引用了这个函数对象本身,而不是窗口对象/全局作用域。
希望有所帮助。
只要调用方法为var test = gmap()。add();
因为gmap是一个函数而不是一个variables