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