2016-09-01 4 views
2

ログの目的のために、要素関数のプロパティのラッパー関数を作成しました。呼び出された関数の現在の要素プロパティ名にアクセスする方法

functionsWrapper: function() { 
    for (i = 0, args = new Array(arguments.length); i < arguments.length; i++) { 
     args[i] = arguments[i]; 
    } 

    console.log('call for ' + arguments.callee.name + ' with params ' + argumantsLog(args)); 

    return this['original' + arguments.callee.name].apply(this, args); 
} 

そして私は、要素の機能をラップするためにこのコードを使用しています: ラッパー関数は、上記で

logFunctionsCalls: function (element) { 
    if (!element) 
     return; 

    if (element.children && element.children.length) 
     for (var i = 0; i < element.children.length; i++) 
      logFunctionsCalls(element.children[i]); 

    if (!element.functionsLogged) { 
     element.functionsLogged = true; 

     for (var property in element) { 
      if (typeof element[property] != 'function') 
       continue; 

      element['original' + property] = element[property]; 
      element[property] = functionsWrapper; 
     } 
    } 
} 

私の問題は、arguments.calleeがのプロパティ名を指定せずにfunctionsWrapperコードが含まれていることです呼び出された関数

+0

'arguments.callee.name'?これは廃止予定のものと非標準のものの1つで、どちらも実際にあなたを助けません。 – Bergi

答えて

1

どこでも同じfunctionWrapperを使用することはできません。どのプロパティが呼び出されたかを知る方法はありません。代わりに、別のラッパーを作成し、元のまま閉じてください。

for (var p in element) (function(property) { 
    if (typeof element[property] != 'function') 
     return; 

    var original = element[property]; 
    element[property] = function wrapped() { 
     console.log('call for ' + property + ' with params ' + Array.prototype.join.call(arguments)); 
     return original.apply(this, arguments); 
    }; 
}(p)); 
+0

私は現在のバージョンの前に似たようなものを使ってきましたが、何らかの理由で 'arguments'オブジェクトが他の関数呼び出しの無関係な引数を指しているので変更しなければなりません。 –

+0

「*他の関数からの無関係な引数を指摘する」とはどういう意味ですか?再現可能なコードの例を提供してください。 – Bergi

+0

たとえば、関数 "appendChild"で 'setAttribute'の引数が明確に渡されている" src "、" http://www.google.com/ "を取得しています –

関連する問題