0
var myString = '';
myString += 'foo';
myString += 'bar';
myString = myString.replace(/oba/, 'qux');

console.log(myString) // produces "foquxr"

有没有办法同样修补功能,比如转动function(a) { a += 'b'; return a; }info function(a) { a += 'b'; console.log(a); return a + 'c'; }

4

2 回答 2

3

您可以这样编写函数

// (compose(f, g))(x, y, ...) is the same as f(g(x, y, ...)) 
function compose(f, g) {
  return function (var_args) {
    return f.call(this, g.apply(this, arguments));
  };
}

所以

var f = compose(
  function (x) { console.log(x); return x + 'c'; },
  function (a) { a += 'b'; return a; });

让你结合两个小函数来获得一个行为像的函数

function(a) { a += 'b'; console.log(a); return a + 'c'; }
于 2012-09-05T14:45:26.480 回答
2

eval您可以通过从其声明中获取函数的主体,根据需要对其进行操作,并通过Function()构造函数重新定义它来实现这一点(不使用):

function myFunction(a) { a += 'b'; return a; }

function changeFunction(){
    var func = window['myFunction'].toString();
    var body = func.substring(func.indexOf("{")+1, func.lastIndexOf("}"));
    body = body.replace("return a;", "console.log(a); return a + 'c';");
    window.myFunction = Function("a", body);
}​

这是一个JSFiddle

于 2012-09-05T15:28:05.223 回答