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);