假设我有一个名为 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/