【问题标题】:How to override function with variable number of parameters in javascript?如何在javascript中使用可变数量的参数覆盖函数?
【发布时间】:2012-02-01 17:42:08
【问题描述】:

我想在我的对象上覆盖 jQuery 的 hide() 函数。我希望它调用我的onHide() 函数,然后调用原始hide()

如何做到这一点?

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

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);
}

【问题讨论】:

    标签: javascript jquery overloading overriding


    【解决方案1】:

    可以使用.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);
    }
    

    【讨论】:

    • 难道this.oldhide.apply(this, arguments) 不会和this.oldhide(arguments) 做同样的事情吗?
    • @Dims,没有。使用第二个,arguments 作为 jQuery 的 hide 的第一个 (duration) 参数传递。
    • 啊,明白了,谢谢!在一般问题上,除了将旧版本的函数保存在临时变量中之外,没有其他方法可以调用旧版本的函数吗?
    • @Dims 不,临时变量几乎是唯一的方法。
    【解决方案2】:

    是的,没有传入的只是undefined

    【讨论】:

    • 但是如果出现带有四个参数的.hide() 的新版本时,代码将需要更改......
    • @Alnitak,只有函数定义会改变。函数的调用者不必更改任何内容。
    • 当然,但这就是 arguments 存在的原因 - 你不需要声明参数 a, b, c 只是为了将它们逐字传递给另一个函数。
    • @Alnitak,同意。主要原因是它们是否也被包装器使用。
    【解决方案3】:

    您可以使用 $.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);
        };
    

    【讨论】:

    • 我不明白,hide() 的参数如何传递给oldhide()?例如,如果我写 myobject.hide(12); 从我的角度来看,12 将会丢失,因为 this.oldhide() 不会进一步传递它。是真的吗?
    • @Dims 我已编辑以包含有关参数传递的信息。
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2011-10-12
    • 2019-07-21
    相关资源
    最近更新 更多