如何检查 javascript 函数及其参数

How to inspect the javascript functions and its arguments

我对 JS 很陌生,我一直在玩 Jasmine。

在 Jasmine 中,我可以看到一个名为 spyOn 的方法,它执行 inspect/spy 功能。

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

你可以找到精确的实现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. 在Java脚本中,事后动态更改对象的方法不是问题。调用 someObj.someMethod = someOtherFunction 是完全有效的。 (为了 100% 准确,您实际上可能不会 覆盖 原始方法,因为它可能在原型链的某个地方,而不是在对象本身上。不过这是一个高级主题,在这里不是很重要。此外,Java 方法和 class 成员之间的区别不适用于 JavaScript。)
  2. 函数内部的特殊 "variable" arguments 包含调用函数时使用的任何参数。在 Java 术语中,假设 someMethod(Foo x1, Bar x2) 始终具有类型 someMethod(Object... arguments) 的隐式第二签名,这意味着您始终可以互换使用 x1arguments[0]
  3. obj.someNameobj["someName"] 在 JavaScript 中完全等价。因此,您可以使用 属性 名称作为字符串轻松 access/change 对象的属性,而在 Java 中您必须使用反射。