var Obj = {
func1 : function() {
// some code
if (this._hasChainedFunc()) {
// block should be CALLED
}
return this;
},
func2 : function() {
// some code
if (this._hasChainedFunc()) {
// block should be NOT called
}
return this;
},
_hasChainedFunc : function() {
// code which detects if there is a chained function???
}
}
Obj.func1().func2();
Run Code Online (Sandbox Code Playgroud)
函数_hasChainedFunc()是否有可能的实现?这个函数应该在第一次调用时返回true(因为 func2() 之后被调用),在第二次调用时返回false。
在更高级的版本中,_hasChainedFunc()也可能返回之后实际调用的函数。
从技术上讲,您永远无法提前知道在当前调用之后是否还有另一个调用链接——这显然没有意义,因为这意味着您知道一些将在调用之前调用的代码。如果没有预编译器,您就无法做到这一点,我想这不是您所追求的。
相反,它是可以检查是否有一直在上次通话链之前,当前呼叫。这只需要你在对象中保留一些关于先前调用的状态,并在你调用一个新函数时更新它。如果您只使用一个调用链,则可以通过在返回对象之前在对象上创建func1和func2更改某些状态来实现此this目的。
如果要在同一个对象上调用多个链,则面临如何检测链的末端的问题。为此,您需要让每个链接函数返回一个围绕原始的包装器this,它将存储有关先前调用的状态。
如果您使用的包装方式,obj.func1().func2()要求func1上obj,但func2上被调用返回的包装func1和此包装可能是意识到以前的func1电话。如果您稍后调用obj.func2().func1()thenfunc2现在被调用,obj而func1在知道先前func2调用的包装器上调用,等等。
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |