覆盖 javascript 函数定义
Overriding a javascript function definition
我正在尝试对第 3 方 javascript 库进行 monkeypatch,但我正在重载的原始函数定义不断被调用。
var ns = {};
ns.topFxn = function(){
var _me = "me";
function _toOverride(){
console.log("This is the original: " + _me);
}
function pubFxn(){
_toOverride();
}
console.log("Original");
ns.pubFxn = pubFxn;
};
//attempt to monkey patch
var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
oldTopFxn();
function _toOverride(){
console.log("This is the overriden: " + _me);
}
console.log("MonkeyPatch");
};
ns.topFxn();
ns.pubFxn();
输出:
scratch.js:15> Original
scratch.js:26> MonkeyPatch
scratch.js:10> This is the original: me
我认为这是因为这个函数被另一个函数间接调用,而那个函数可能在它指向的函数上持有一个闭包 - 所以这可能是不可能的?关于如何覆盖有什么建议吗?
由于范围可变,您不能在另一个函数中覆盖局部函数。名称 _toOverride
是每个函数的局部名称,在您的函数中分配它对不同函数中的同名函数没有影响。
您必须覆盖 ns.pubFxn
。
var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
oldTopFxn();
var oldPubFxn = ns.pubFxn;
function _toOverride(){
console.log("This is the overriden: " + _me);
}
ns.pubFxn = function() {
oldPubFxn();
_toOverride();
}
console.log("MonkeyPatch");
};
我正在尝试对第 3 方 javascript 库进行 monkeypatch,但我正在重载的原始函数定义不断被调用。
var ns = {};
ns.topFxn = function(){
var _me = "me";
function _toOverride(){
console.log("This is the original: " + _me);
}
function pubFxn(){
_toOverride();
}
console.log("Original");
ns.pubFxn = pubFxn;
};
//attempt to monkey patch
var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
oldTopFxn();
function _toOverride(){
console.log("This is the overriden: " + _me);
}
console.log("MonkeyPatch");
};
ns.topFxn();
ns.pubFxn();
输出:
scratch.js:15> Original
scratch.js:26> MonkeyPatch
scratch.js:10> This is the original: me
我认为这是因为这个函数被另一个函数间接调用,而那个函数可能在它指向的函数上持有一个闭包 - 所以这可能是不可能的?关于如何覆盖有什么建议吗?
由于范围可变,您不能在另一个函数中覆盖局部函数。名称 _toOverride
是每个函数的局部名称,在您的函数中分配它对不同函数中的同名函数没有影响。
您必须覆盖 ns.pubFxn
。
var oldTopFxn = ns.topFxn;
ns.topFxn = function(){
oldTopFxn();
var oldPubFxn = ns.pubFxn;
function _toOverride(){
console.log("This is the overriden: " + _me);
}
ns.pubFxn = function() {
oldPubFxn();
_toOverride();
}
console.log("MonkeyPatch");
};