javascript - 重新连接 JavaScript 函数

标签 javascript dependency-injection

假设我有一个名为 fna() 的函数,它执行以下简单操作:

var fna = function(ar) {
    console.log("argument: ", ar);
    return "return value is argument too: " + ar;
}

fna() 是由其他开发人员编写的,我无法访问它。他没有费心类型转换任何事件,当它被调用时,我必须知道它。希望他的方法可以通过 window.fna() 访问。

我想要执行一些额外的代码。比方说,添加这个 console.log

var fna = function(ar) {
     console.log("Hola, I am some additional stuff being rewired");
     console.log("argument:", ar);
     return "return value is argument too: " + ar;
}

我希望即使在 fnb() 被代码的其他部分调用时也能执行此操作。

var fnb = function() {
    return fna("Bonjour, I am fnb and I call fna");
}

这是我找到的一种方法,使用 utils.rewire() 方法。 utils 只是一些实用工具,它可以作为插件添加到您喜欢的框架中。不幸的是,它只适用于 Firefox。

var utils = utils || {};
// Let's rewire a function. i.e. My.super.method()
utils.rewire = function(functionFullName, callback) {
    var rewired = window[functionFullName];
    console.log("%s() is being rewired", functionFullName)

    window[functionFullName] = function() {
        callback();
        return rewired.apply(this, arguments);
    }
}

像这样使用它。

utils.rewire("fna",function(){
    console.log("Hola, I am some additional stuffs being rewired");
});

这似乎有效,如 this jsbin 中所示,但是(这是我的问题:)我如何重新布线 obja.fna()?

var obja = {
    fna = function(ar) {
        console.log("argument:", ar);
        return "return value is argument too: " + ar;
    }
};

我无法让它重新连接 some.object.method() 方法。

额外的奖励问题:有没有更简洁的方法来做到这一点?开箱即用的简洁而神奇的库?

最佳答案

rewire 重构为作用于任何给定对象的 rewireMethod 函数:

var utils = utils || {};
utils.rewireMethod = function (obj, functionName, prefunc) {
    var original = obj[functionName];

    obj[functionName] = function () {
        prefunc();
        return original.apply(this, arguments);
    };
};

注意 rewire 现在可以写成:

utils.rewire = function (functionName, prefunc) {
    utils.rewireMethod(window, functionName, prefunc);
};

然后你就可以称它为:

utils.rewireMethod(obja, "fna", function () {
    console.log("Hola, I am some additional stuff being rewired");
});

请注意,如果您有类似 window.ideeli.Search.init() 的方法,则不需要任何特殊的东西。在这种情况下,对象是 window.ideeli.Search,方法名称是 init:

utils.rewireMethod(window.ideeli.Search, "init", function () {
    console.log("Oh yeah, nested objects.");
});

关于javascript - 重新连接 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20528104/

相关文章:

javascript - 如何将 onchange 选定的下拉值存储到隐藏的输入字段中?

javascript - 将外部文件与 AngularJs 集成

javascript - 最后在 rxjs 上序列在第一个错误时执行

javascript - 如何在不删除现有事件的情况下添加事件,但阻止表单提交

c# - Ninject 依赖解析器

c# - 简单注入(inject)器:跨相同图的服务注入(inject)相同的UnitOfWork实例

angular - 以 Angular 注入(inject)具有基类类型的父组件

javascript - 动态改变div的ID?

c# - 使用 Ninject 跨类传递参数

php - 自引用模型导致 Laravel 4 中 x 的最大函数嵌套级别