我有一个已经分配的功能,我想附加一些额外的脚本。当我显示如下函数时:
foreach
显示以下内容:
var func = obj.when_clicked;
alert(func);
类型是“函数”,函数在别处执行,我无法更改,代码为:
function object_123(){
object_123_Action();
}
我需要通过附加我自己的代码来修改该函数,使其成为:
this.when_clicked();
然后将其添加回来并重写function object_123(){
object_123_Action();
my_clicked(obj);
}
函数。
如果我手动添加如下代码,它确实有效:
when_clicked
但是,我不知道函数最初是什么,我只想附加:
obj.when_clicked = function object_123(){object_123_Action();my_clicked(obj);};
我确实需要my_clicked(obj);
成为感兴趣的实际对象,即obj。
答案 0 :(得分:5)
你可以包装它:
var f = this.when_clicked;
this.when_clicked = function() {
// Call the original
var rv = f.apply(this, arguments);
// your code here
// Return the original function's return value
return rv;
};
Function#apply
使用指定的this
标记调用原始文件。 arguments
由JavaScript引擎提供:它是函数被调用的参数的伪数组,因此上面的代码只传递了它们。
如果您的函数抛出异常,请务必考虑它意味着什么,如果您想要抑制它们,请抓住它们。
如果你经常这样做,你可以给自己一个实用功能:
function wrapFunction(f, wrapper) {
return function() {
var rv = f.apply(this, arguments);
wrapper.apply(this, arguments);
return rv;
};
}
然后
this.when_clicked = wrapFunction(this.when_clicked, function() {
// Your code here
});
或者,如果您想要访问原始的返回值,可能会更改它:
function wrapFunction(f, wrapper) {
return function() {
var rv = f.apply(this, arguments);
rv = wrapper.call(this, rv, arguments);
return rv;
};
}
然后
this.when_clicked = wrapFunction(this.when_clicked, function(rv, args) {
// Your code here, using `rv` and `args`, which is a pseudo-array
// Potentially update `rv`
return rv;
});
答案 1 :(得分:0)
您可以将函数存储在对象的数组中。 然后,循环执行另一个函数中的函数并执行它们。
-28
并添加功能:
var myObj = { 'myfunctions': [ ] };
或者如果您已经有一个命名函数:
myObj.myFunctions.push (function () { /*function code here*/ });
要调用所有函数,请使用此函数(不要将此函数添加到myObj)
myObj.myFunctions.push (nameOfFunction);
在@peter的另一个问题上使用了这个答案。想在这里发帖。