0

Javascript関数をオーバーライド(強化)する必要があります。問題は、関数が自動的に生成されることです。

var original_function = getFunction('someID'); // eval('someID');

私のコードは次のようになります。

var f = function(arg) { 
 do_some_stuff(); 
 original_function(arg);  
 do_another_stuff(); 
} 

そして今、コードの他の部分が呼び出さgetFunction('someID')れると、f('someID')が返されます。

名前がわかっている場合、または関数オブジェクトしかない場合に、元の関数をオーバーライドするにはどうすればよいですか?

4

3 に答える 3

1
function someFunc (arg) { alert(arg)}


function injectFunc(original, injection, inject_after) {
if(typeof original === "string") original = window[original];
return function() {
    if(!inject_after) injection.apply(this, arguments);
    var result = original.apply(this, arguments);
    if(inject_after) injection.apply(this, arguments);
    return result;
    }
}

// insert before
someFunc = injectFunc(someFunc, function(arg) {alert("Before" + arg)});

// or with string func name
someFunc = injectFunc('someFunc', function(arg) {alert("Before" + arg)});

// and after
someFunc = injectFunc(someFunc, function(arg) {alert("After" + arg)}, true);


// and with olny func name 
window['someFunc'] = injectFunc('someFunc', function(arg) {alert("After" + arg)}, true);

すべての注入は関数に保存されます

于 2012-08-21T06:03:25.973 に答える
0

保管して交換してください。

//original
function someId(arg) { alert(arg); }

//replace    
(function() {
    var original_function = window["someId"];
    window.someId = function(arg) { 
       alert("new");
       return original_function.apply(this, arguments);
    }
})();

//call     
someId("hello");
于 2012-07-03T13:54:27.567 に答える
0

関数がわかっていて、それがグローバル スコープ内にある場合は、ブラケット表記で参照できます。

var orgFunction = window["functionName"];

次のようgetFunctionになります

function getFunction (name) {\
     return window[name];
}
于 2012-07-03T13:46:10.083 に答える