7719


次のような方法であるオブジェクトの全てのメンバを拡張する処理を書いています。  
拡張すると元のメソッドを呼んだ時に追加で「console.log("add" + name);」が実行されるようにしています。

ここでfuncAとfuncBは問題ないのですが、引数があるfuncCを拡張する方法で迷っています。  
解決策をお持ちの方がいらしたら教えていただけると助かります。

[code]

    <script>
    
    var SomeObj = {
        funcA: function(){
            console.log("Do FuncA!!");
        },
        funcB: function(){
            console.log("Do FuncB!!");
        },
        funcC: function(arg1,arg2){
            console.log(arg1 + arg2);
        }
    };
    
    
    
    for(i in SomeObj){
    
        if(SomeObj.hasOwnProperty(i) && typeof SomeObj[i] === "function"){
    
            //console.log(i);
    
            SomeObj[i] = (function(){
                var tmp = SomeObj[i];
                var name = i;
                var f = function(){
                    tmp();
                    console.log("add" + name);
                };
                return function(){
                    return f();
                };
            })();
        }
    }
    
    SomeObj.funcA();
    SomeObj.funcB();
    SomeObj.funcC("a", "b");
    
    </script>
    
[/code]


CC BY-SA 3.0
2015-03-10T09:04:57.150
7718
2015-03-10T09:23:15.727
3496
question
javascript
jsで引数付きのメソッドを上書き拡張する方法


意図を正確に掴めているか自信が無いですが、こういうので良いんでしょうか？  
Function.prototype.apply（またはcall）を使えば、引数を汎用的に（？）引き渡すことができます。  
※下記コードは質問文のコードのfor-inとifの中身で、fとtmpの呼び出し部分だけ修正したものです。

[code]

        SomeObj[i] = (function(){
            var tmp = SomeObj[i];
            var name = i;
            var f = function(){
                tmp.apply(this, arguments);
                console.log("add" + name);
            };
            return function(){
                return f.apply(this, arguments);
            };
        })();
    
[/code]

【追記】  
蛇足ですが、これだけだったら f は無くても良さそうです。

[code]

    SomeObj[i] = (function(){
        var tmp = SomeObj[i];
        var name = i;
        return function(){
            var result = tmp.apply(this, arguments);
            console.log("add" + name);
            return result;
        };
    })();
    
[/code]


CC BY-SA 3.0
2015-03-10T09:10:02.777
7719
2015-03-10T09:23:15.727
2015-03-10T09:23:15.727
8078
8078
7718
answer