所以,我希望每次调用给定函数时都会执行一些代码,这是可行的吗?事实上,我可以覆盖现有的功能并添加代码,但这需要我知道该功能的确切内容...想象一下“库”的“插件”,你想要插件 - 每次调用此librairy的特定函数时执行代码,但您不想覆盖原始的librairy内容...希望我足够清楚!
如果它可行,是否有办法检索提交给函数的参数?
答案 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();