Javascript 袖珍参考,p. 121:这个 "monkey-patching" 方法应该如何工作?
Javascript Pocket Reference, p. 121: How is this "monkey-patching" method supposed to work?
作为 apply()
概念的说明,Javascript Pocket Reference 一书,O'Reilly,2012 年第 3 版提供了以下代码示例:
// Replace the method named m of the object o with a
// version that logs messages before and after invoking
// the original method.
function trace(o, m) {
var original = o[m]; // Remember original method.
o[m] = function() {
// Now define the new method.
console.log(new Date(), "Entering:", m); // Log
// Invoke the original method
var result = original.apply(this, arguments);
console.log(new Date(), "Exiting:", m); // Log
// Return the result of the original method
return result;
};
}
我明白这个 trace
方法应该做什么(获取一个对象并包装该方法以记录执行时间的开始和结束。)
我只是不明白这怎么能做到这一点。它不会 return 新的 o[m]
方法,也不会调用它。
如果我有
var obj = {
double: function(num) {
return 2 * num;
}
}
如何调用 trace
来查看日志?
它正在替换对象中名为 m
的方法。 m
实际上只是指向函数的对象散列中的一个键,trace
将其替换为另一个包装原始函数的函数。
在你的例子中,你会像这样调用它:
trace(obj, 'double');
你会这样称呼它:
obj.double(2);
作为 apply()
概念的说明,Javascript Pocket Reference 一书,O'Reilly,2012 年第 3 版提供了以下代码示例:
// Replace the method named m of the object o with a
// version that logs messages before and after invoking
// the original method.
function trace(o, m) {
var original = o[m]; // Remember original method.
o[m] = function() {
// Now define the new method.
console.log(new Date(), "Entering:", m); // Log
// Invoke the original method
var result = original.apply(this, arguments);
console.log(new Date(), "Exiting:", m); // Log
// Return the result of the original method
return result;
};
}
我明白这个 trace
方法应该做什么(获取一个对象并包装该方法以记录执行时间的开始和结束。)
我只是不明白这怎么能做到这一点。它不会 return 新的 o[m]
方法,也不会调用它。
如果我有
var obj = {
double: function(num) {
return 2 * num;
}
}
如何调用 trace
来查看日志?
它正在替换对象中名为 m
的方法。 m
实际上只是指向函数的对象散列中的一个键,trace
将其替换为另一个包装原始函数的函数。
在你的例子中,你会像这样调用它:
trace(obj, 'double');
你会这样称呼它:
obj.double(2);