1

我想重写我的对象上的jQuery的hide()函数。我希望它调用我的onHide()函数,然后调用原始hide()如何用JavaScript中的可变参数数量覆盖函数?

如何做到这一点?

最简单的代码将不会传递参数我想:

myobject.oldhide = myobject.hide; 
myobject.onHide = function() { 
    // something 
}; 
myobject.hide = function() { 
    this.onHide(); 
    this.oldhide(); 
} 

jQuery的hide()接受了3个参数。我可以只定义其中3个吗?

myobject.oldhide = myobject.hide; 
myobject.onHide = function() { 
    // something 
}; 
myobject.hide = function(a,b,c) { 
    this.onHide(); 
    this.oldhide(a,b,c); 
} 

回答

5

您可以使用.apply()调用原:

this.oldhide.apply(this, arguments); 

它将调用oldhide与任何参数列表传递给自己的函数,它不需要有任何声明参数:

myobject.oldhide = myobject.hide; 

myobject.onHide = function() { 
    // something 
}; 

myobject.hide = function() { 
    this.onHide(); 
    this.oldhide.apply(this, arguments); 
} 
+0

'this.oldhide.apply(this,arguments)'不会与'this.oldhide(arguments)'相同吗? – Dims 2012-02-01 20:23:54

+1

@Dims,no。第二,'arguments'作为jQuery'hide'的第一个('duration')参数传递。 – 2012-02-01 20:31:00

+0

啊,明白了,谢谢!在一般的问题中,除了将其保存在临时变量中之外,没有其他方法可以调用旧版本的函数了吗? – Dims 2012-02-01 20:38:42

2

是的,未通过的将只是undefined

+0

但代码,就需要改变,如果.hide()'这四个参数的'新版本走来.... – Alnitak 2012-02-01 17:46:04

+0

@Alnitak,只有函数定义会发生变化。函数的调用者不需要改变任何东西。 – 2012-02-01 17:51:07

+0

当然,但这就是为什么'arguments'存在 - 你不需要声明参数'a,b,c'只是为了逐字传递给另一个函数。 – Alnitak 2012-02-01 17:52:57

0

您可以使用$.proxy来缓存旧皮。

myobject.oldhide = $.proxy(myobject.hide, myobject); 
    myobject.onHide = function() { 
     // something 
    }; 
    //a, b, and c parameters don't have to be passed 
    //but if they are they will be forwarded to the old hide. 
    //Using $.proxy will preserve the way the old function takes parameters. 
    myobject.hide = function(a, b, c) { 
     this.onHide(); 
     this.oldhide(a, b, c); 
    }; 
+0

我不明白,hide()'的参数怎么会传递给'oldhide()'?例如,如果我写'myobject.hide(12);'从我的角度来看'12'将会丢失,因为'this.oldhide()'不会进一步传递它。这是真的吗? – Dims 2012-02-01 20:19:11

+0

@Dims我编辑了包含有关参数传递的信息。 – sinemetu1 2012-02-01 21:11:35