0

为了简化调试咖啡脚本应用程序,我希望有一个logWrapClass(Klass)函数可以console.log(method.name, method.arguments)使用方法包装器自动将 a 添加到我的类中的方法中,这可行吗?

这似乎还不够

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 由于某种原因指向同一个元素一样。

编辑:好的,现在更奇怪了,因为如果我将调用分成两个函数

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 回答