JavaScript猴子补丁

JavaScript monkey-patching

本文关键字:补丁 猴子 JavaScript      更新时间:2023-09-26

这段代码是我从JS书中获取的。我不知道应该把什么样的方法作为参数传递给这个函数(m)当我这样做时,它输出undefined:

function trace(o, m) {
  var original = o[m]; // Remember original method in the closure.
  o[m] = function() { // Now define the new method.
    console.log(new Date(), "Entering:", m); // Log message.
    var result = original.apply(this, arguments); // Invoke original.
    console.log(new Date(), "Exiting:", m); // Log message.
    return result; // Return result.
  };
}
var a = {
  x: 1,
  y: 2
};
var plus = function(obj) {
  return this.x + this.y;
}

o为对象,m为方法名

/**
 * Modifies a given object's property by making it log
 * the enter/exit times of a method call
 * @param {object} o object that has a method that will be called
 * @param {string} m name of the method within the given object
 */
function trace(o, m) {
    var original = o[m]; // Remember original method in the closure.
    o[m] = function() { // Now define the new method.
        console.log(new Date(), "Entering:", m); // Log message.
        var result = original.apply(this, arguments); // Invoke original.
        console.log(new Date(), "Exiting:", m); // Log message.
        return result; // Return result.
    };
}
var obj = {
  doSomething: function() {
      console.log('obj.doSomething was called');
  }
};
// Won't log enter/exit times
obj.doSomething();
trace(obj, "doSomething");
// Will log enter/exit times
obj.doSomething();

下面是一个例子。

形参o必须是一个对象。第二个参数m是0中方法的名称。跟踪方法替换对象中的方法。新方法增加了一些日志记录并调用被替换的方法。

function trace(o, m) {
    var original = o[m]; // Remember original method in the closure.
    o[m] = function() { // Now define the new method.
        console.log(new Date(), "Entering:", m); // Log message.
        var result = original.apply(this, arguments); // Invoke original.
        console.log(new Date(), "Exiting:", m); // Log message.
        return result; // Return result.
    };
}
var a = {x:1, y:2};
var plus = function (obj) {
    return this.x + this.y;
}
var test = {
	method : plus
}
trace(test, "method");
test.method(a);