Javascript 如何重写函数而不是引用?
这是我保存在Javascript 如何重写函数而不是引用?,javascript,jasmine,Javascript,Jasmine,这是我保存在api中的基本自执行函数和私有函数。 我的问题是,现在我无法从函数外部覆盖deepCalculate 这是个什么问题?我使用Jasmine,想测试函数是否被调用。例如: var BigObject = (function() { function deepCalculate(a, b, c) { return a + b + c; } function calculate(x) { deepCalculate(x, x, x); } retu
api
中的基本自执行函数和私有函数。
我的问题是,现在我无法从函数外部覆盖deepCalculate
这是个什么问题?我使用Jasmine
,想测试函数是否被调用。例如:
var BigObject = (function() {
function deepCalculate(a, b, c) {
return a + b + c;
}
function calculate(x) {
deepCalculate(x, x, x);
}
return {
calculate: calculate,
api: {
deepCalculate: deepCalculate
}
}
})();
失败了。然而,当我调试时,我确信Jasmine将BigObject.api.deepCalculate
绑定为间谍,但是从内部calculate仍然调用原始deepCalculate
函数,而不是间谍
我想知道如何覆盖函数,而不仅仅是函数的引用。简单的答案是:
spyOn(BigObject, 'calculate').andCallThrough();
expect(BigObject.api.deepCalculate).toHaveBeenCalled();
虽然我必须这么说,但我会认真考虑其他方法来实现你想做的事情。海事组织认为,关闭应作为一个整体来处理。随意地替换它的一部分将很快被证明是一场噩梦:你不知道在任何给定的时间点闭包函数是什么,它在哪里被更改,以前的状态是什么,以及它为什么被更改临时解决方案可能是:
(function ()
{
var overWriteMe = function(foo)
{
return foo++;
},
overWrite = function(newFunc)
{
for (var p io returnVal)
{
if (returnVal[p] === overWriteMe)
{//update references
returnVal[p] = newFunc;
break;
}
}
overWriteMe = newFunc;//overwrite closure reference
},
returnVal = {
overWrite: overWrite,
myFunc: overWriteMe
};
}());
依我看,这要安全得多,因为它允许您选择一个不同的“内部”函数一次性使用,而不改变代码的核心行为。您在最后一行缺少一个右大括号。是的,但这没有任何区别。这只是举个例子
var foo = (function()
{
var calc = function(x, callback)
{
callback = callback || defaultCall;
return callback.apply(this, [x]);
},
defaultCall(a)
{
return a*a+1;
},
return {calc: calc};
}());
foo(2);//returns 5
foo(2,function(x){ return --x;});//returns 1
foo(2);//returns 5 again