0

CoffeeScriptアプリケーションのデバッグを容易にするために、メソッドラッパーを使用してクラス内のメソッドにlogWrapClass(Klass)を自動的に追加する関数が必要ですが、それは実行可能ですか?console.log(method.name, method.arguments)

これでは不十分なようです

consoleLogWrapClass = (Klass) ->
  klassName = Klass.toString()
  klassName = klassName.substr 'function '.length
  klassName = klassName.substr 0, klassName.indexOf('(')

  K = Klass.prototype
  for prop of K #in Object.getOwnPropertyNames(K)
    obj = K[prop]
    if typeof(obj) is 'function'
      decoratedName = "#{klassName}::#{prop}"
      K[prop] = () ->
        console.debug 'trace: '+decoratedName, arguments
        return obj.apply this, arguments

私がする時

class Someclass
    ...

consoleLogWrapClass Someclass

ラッパーが初期クラスのすべての関数を統合したように見えます。たとえば、すべてのobjとdecoratedNameが何らかの理由で同じ要素を指している場合などです。

編集:わかりました、呼び出しを2つの関数に分割すると、さらに奇妙になります

consoleLogWrapFunction = (fn, decoratedName) ->
  () ->
    console.debug 'trace: '+decoratedName, arguments
    return fn.apply this, arguments

consoleLogWrapClass = (Klass) ->
  klassName = Klass.toString()
  klassName = klassName.substr 'function '.length
  klassName = klassName.substr 0, klassName.indexOf('(')

  K = Klass.prototype
  for prop of K #in Object.getOwnPropertyNames(K)
    obj = K[prop]
    if typeof(obj) is 'function'
      K[prop] = consoleLogWrapFunction obj, "#{klassName}::#{prop}"

それは機能します、誰かが理由を説明できますか?

4

2 に答える 2

1
consoleDebugWrapFunction = (name, fn) ->
  ->
    console.log "#{name} called with arguments: #{[].slice.call(arguments).join ', '}"
    fn.apply this, arguments

consoleDebugWrapClass = (Klass) ->
  for prop of Klass.prototype
    obj = Klass.prototype[prop]
    if typeof obj is 'function'
      Klass.prototype[prop] = consoleDebugWrapFunction prop, obj

使用例:

class A
  foo: (a, b) ->
    a + b

consoleDebugWrapClass A
a = new A
console.log a.foo 3, 6

出力:

foo called with arguments: 3, 6
9
于 2012-06-10T17:42:47.580 に答える
0

多分この監査は役に立ちます

JavaScriptで単純な優先リスナーパターンを実装する方法

この手法を使用して、すべてのプロトタイプメンバーをラップできます

function wrap(o,f) {for(var n in o) if (typeof(n)=="function") o[n]=f.prefix(o[n]);}

o=ラップするオブジェクト

f=監査機能

于 2012-06-10T17:43:25.993 に答える