javascript - 如何动态改变一个函数

标签 javascript

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

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 成为感兴趣的实际对象,即 obj。

最佳答案

你可以包装它:

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;
});

关于javascript - 如何动态改变一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584310/

相关文章:

javascript - 我可以在 Dialogflow 的内联编辑器中使用意图参数吗?

javascript - 如何在 xpath 1.0 中选择第 n 项?

javascript - 带有几行代码的 CodeMirror 在触发重绘之前不会显示

javascript - 具有模糊轮廓的传单多边形

javascript - 在 Chrome 中以编程方式打开上传文件对话框

javascript - 浏览器存储 - 物理位置?

javascript - 禁用 jQuery 自动完成中的选项?

javascript - Javascript 每五秒循环一次

JavaScript - 在变量声明期间定义先前声明的对象的属性是否可以?

javascript - JQuery - 对象 [object Object] 没有方法