为了简化调试咖啡脚本应用程序,我希望有一个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}"
它有效,有人可以解释为什么吗?