Как переопределить функцию с переменным количеством параметров в JavaScript? - PullRequest
1 голос
/ 01 февраля 2012

Я хочу переопределить функцию jQuery hide() для моего объекта. Я хочу, чтобы он вызывал мою onHide() функцию, а затем вызывал оригинал hide().

Как это сделать?

Самый простой код не будет передавать параметры, я думаю:

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

jQuery's hide() принимает до 3 параметров. Могу ли я просто определить 3 из них?

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

Ответы [ 3 ]

5 голосов
/ 01 февраля 2012

Вы можете использовать .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);
}
2 голосов
/ 01 февраля 2012

Да, те, которые не были переданы, будут просто undefined.

0 голосов
/ 01 февраля 2012

Вы можете кэшировать старую шкуру, используя $. 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);
    };
...