如何检查 javascript 函数及其参数
How to inspect the javascript functions and its arguments
我对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背景的三件重要的事情是:
- 在 JavaScript 中,事后动态更改对象的方法不是问题。调用
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 中必须使用反射。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数