如何动态更改功能

时间:2015-09-15 10:59:15

标签: javascript

我有一个已经分配的功能,我想附加一些额外的脚本。当我显示如下函数时:

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。

2 个答案:

答案 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的另一个问题上使用了这个答案。想在这里发帖。