如何检查 javascript 函数及其参数

How to inspect the javascript functions and its arguments

本文关键字:函数 参数 javascript 何检查 检查      更新时间:2023-09-26

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

在Jasmine中,我可以看到一个名为spyOn的方法,它确实检查/监视功能。

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

你可以在 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 中必须使用反射。