Javascript:如何在不覆盖该函数的情况下在函数调用上执行代码?

时间:2010-10-27 20:25:17

标签: javascript function call

所以,我希望每次调用给定函数时都会执行一些代码,这是可行的吗?事实上,我可以覆盖现有的功能并添加代码,但这需要我知道该功能的确切内容...想象一下“库”的“插件”,你想要插件 - 每次调用此librairy的特定函数时执行代码,但您不想覆盖原始的librairy内容...希望我足够清楚!

如果它可行,是否有办法检索提交给函数的参数?

4 个答案:

答案 0 :(得分:3)

听起来像是我的包装函数的工作。

编写一个调用其他函数的函数,并将代码放在该函数的末尾(或任何地方)。然后总是打电话给你的版本。

适配器模式的排序。 http://en.wikipedia.org/wiki/Adapter_pattern

我相信如果你不能修改调用代码,你可以隐藏原始函数的范围并命名你的名字(不适用于某些内部函数,如alert,但应该适用于库代码)。如果这不是一个选项,请查看prototype是否允许您扩展对象以添加功能。 http://phrogz.net/js/classes/ExtendingJavaScriptObjectsAndClasses.html

    //Only add this implementation if one does not already exist. 
if (Array.prototype.slice==null) Array.prototype.slice=function(start,end){ 
   if (start<0) start=this.length+start; //'this' refers to the object to which the prototype is applied 
   if (end==null) end=this.length;
   else if (end<0) end=this.length+end;
   var newArray=[];
   for (var ct=0,i=start;i<end;i++) newArray[ct++]=this[i];
   return newArray;
}

对于参数,您还可以使您的版本采用可选参数(类似于jQuery / MooTools),然后查看传递的内容。

此处可选参数的示例。 http://www.openjs.com/articles/optional_function_arguments.php

function accident() {
    for( var i = 0; i < arguments.length; i++ ) {
        alert("This accident was caused by " + arguments[i]);
    }
}

答案 1 :(得分:1)

可能你可以覆盖对函数的引用?例如:

function add1(x) { return x + 1; }
function log_calls(f, name) {
    return function() {
        console.log("got a call to", name, "with args", arguments);
        return f.apply(null, arguments);
    }
}
add1 = log_calls(add1, "add1");

然后调用add1就像是:

>> x = add1(42)
"got call to add1 with args [42]"
>> x
43

答案 2 :(得分:1)

这绝对可行。 JS是一种动态语言,因此您可以使用自己的函数交换存储在对象中的函数。例如:

var fxnToWrap = obj.someFunction;
obj.someFunction = function() {
    console.log("booyah, I'm intercepting every call to obj.someFunction");
    fxnToWrap.apply(obj, arguments);
}

答案 3 :(得分:0)

编辑纠正评论中指出的错误

这可能会解决您的问题:

function f() {alert("in f");}
var saved_f = f;
var f = function() {
  alert("in f2");
  saved_f();
}
f();