如何检查javascript函数及其参数

时间:2015-01-26 13:52:49

标签: javascript jasmine

我是JS的新手,我一直在玩Jasmine。

在Jasmine中,我可以看到一个名为spyOn的方法,它会检查/监视函数。

这在js中如何运作?来自Java背景是代理吗?怎么写一个?

1 个答案:

答案 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背景的三个重要事项是

  1. 在JavaScript中,事后动态地更改对象的方法不是问题。致电someObj.someMethod = someOtherFunction完全有效。 (要100%精确,你可能实际上不会覆盖原始方法,因为它可能在原型链的某个地方,而不是在对象本身上。这虽然是一个高级主题而且,Java在方法和类成员之间的区别并不适用于JavaScript。)
  2. 特殊"变量"函数内的arguments包含调用函数的任何参数。在Java术语中,假设someMethod(Foo x1, Bar x2)始终具有someMethod(Object... arguments)类型的隐式第二个签名,这意味着您可以始终互换地使用x1arguments[0]
  3. obj.someNameobj["someName"]在JavaScript中完全等效。因此,您可以使用属性名称作为字符串轻松访问/更改对象的属性,在Java中您必须使用反射。