この
var whee = {
test: function(ab) {
console.log(ab);
this.test2('Hello', 'World');
},
test2: function(a, b) {
console.log(a+' '+b);
}
};
function augment(obj, withFn) {
var name, fn;
for (name in obj) {
fn = obj[name];
if (typeof fn === 'function') {
obj[name] = (function(name, fn) {
var args = arguments;
return function() {
withFn.apply(this, args);
fn.apply(this, arguments);
}
})(name, fn);
}
}
}
augment(whee, function(name, fn) {
console.log("calling " + name);
});
whee.test('hi');
機能の増強は、第一パラメータと第二のような関数としてOBJを取るしてください。関数を探しているオブジェクトのすべてのメンバーをループします。 1つが見つかると、渡された関数と元の関数を呼び出す関数に置き換えられます。私はこのstackoverflow answerのコードのほとんどすべてを盗んだ。
ウィンドウオブジェクトに渡したときにうまく動作しないように思われるので、関数がすべてウィンドウスコープで宣言されていないことを願っています。
answerもあり、Function.prototype.call関数を独自の関数でオーバーライドしようとしています。私はそれをFirefoxで動作させることができませんでしたが、おそらくあなたはより良い運を持っています。
なぜ、どの関数が渡されたのか知っておく必要がありますか?パラメータのために?私にはあなたのデザインを変えなければならないようです。片側に柔軟性がありますが、あなたがどの具体的なインスタンスを扱っているかを知る必要はありません。文脈についてもっと詳しく説明できますか?それとも、デバッグ用ですか? –
私が 'console.log(myFunction)'を実行してコンソールの出力をクリックすると、Scriptタブの関数にまっすぐジャンプします。 – nickf
@felixここに例があります。アイテムのリストからアイテムを選択すると問題が発生します。アイテムが選択されたときに呼び出される関数を見つけてそこで何が起こっているのかを確認する必要があります。それはちょうどonclick()のように見えます。 Obv私はそのメソッドが設定されている場所を見つけることができますが、それ自体が渡された関数かもしれないので、時には時間がかかることがあります。コードベースは大規模なものなので、手作業で調べるのではなく、迅速に自動で見つけ出す必要があります。 – Shawn