我是JS的新手,我一直在玩Jasmine。
在Jasmine中,我可以看到一个名为spyOn
的方法,它会检查/监视函数。
这在js中如何运作?来自Java背景是代理吗?怎么写一个?
答案 0 :(得分:2)
您可以找到准确的实施on GitHub,但这里有一个简化的解释:
function mySpy(obj, methodName) {
// remember the original method
var originalMethod = obj[methodName];
// ... then replace it with a method that ...
obj[methodName] = function () {
// ... does whatever additional thing it wants to do ...
console.log(methodName + " called, first argument: " + arguments[0]);
// ... and then calls the original method with the same arguments,
// and returns the result.
return originalMethod.apply(this, arguments);
};
}
现在你可以这样做:
var o = {
inc: function (x) { return x + 1; }
};
mySpy(o, "inc");
console.log(o.inc(13));
这将输出
inc called, first argument: 13
14
来自Java背景的三个重要事项是
someObj.someMethod = someOtherFunction
完全有效。 (要100%精确,你可能实际上不会覆盖原始方法,因为它可能在原型链的某个地方,而不是在对象本身上。这虽然是一个高级主题而且,Java在方法和类成员之间的区别并不适用于JavaScript。)arguments
包含调用函数的任何参数。在Java术语中,假设someMethod(Foo x1, Bar x2)
始终具有someMethod(Object... arguments)
类型的隐式第二个签名,这意味着您可以始终互换地使用x1
和arguments[0]
。obj.someName
和obj["someName"]
在JavaScript中完全等效。因此,您可以使用属性名称作为字符串轻松访问/更改对象的属性,在Java中您必须使用反射。