gpt4 book ai didi

javascript - 记录每个方法?

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:45 28 4
gpt4 key购买 nike

不必为 TRACE 创建自定义记录器,例如在调用了哪些方法以及实例化了哪些类之后,是否有一种简单的方法可以使类下的所有方法自己记录下来?这是针对 node.js 应用程序的。

class MyClass

constructor: () ->
console.log 'MyClass:constructor'

doThat: () ->
console.log 'MyClass:doThat'

exports.MyClass = MyClass

myClass = new MyClass()
myClass.doThat()

如果按照我的方式,您会看到 4 条日志消息而不是 2 条(因此不必编写更少的代码来跟踪正在发生的事情)。

最佳答案

我最近需要实现类似这样的东西来跟踪一些复杂的 OO 递归内容。基本上,我想让一个方法“可追溯”而不会对它造成太多污染;所以也许解决方案也可以在这里应用。

首先添加一个让其他函数可追溯的函数:

Function::trace = do ->
makeTracing = (ctorName, fnName, fn) ->
(args...) ->
console.log "#{ctorName}:#{fnName}"
fn.apply @, args
(arg) ->
for own name, fn of arg
@prototype[name] = makeTracing @name, name, fn

然后,要使用它,只需在每个要跟踪的方法之前添加一个@trace:

class MyClass
@trace methodA: ->
@methodB 42

@trace methodB: ->
console.log "method b called with #{n}"

或者只添加一次@trace,然后将所有可跟踪的方法缩进一层:

class MyClass
@trace
methodA: ->
@methodB 42

methodB: (n) ->
console.log "method b called with #{n}"

如您所见,trace 有点滥用 CoffeeScript 的语法。 method: -> 'foo'class MyClass 中被解释为方法定义。但是 @trace method: -> 'foo' 被解释为调用 MyClasstrace 函数(这是一个 Function 实例,我们向其添加了 trace 函数),并通过一个 method 键将文字对象传递给它。在 JavaScript 中,它类似于 this.trace({method: function() {return 'foo';}})

trace 函数将获取该对象并迭代它的键(方法名称)和值(方法),并将函数添加到记录它们的 MyClass 原型(prototype)调用并依次调用原始方法。

无论如何,(new MyClass).methodA() 的输出将是:

MyClass:methodA
MyClass:methodB
method b called with 42

不过,此解决方案不适用于构造函数,因为它们不仅仅是普通方法。

你可以很喜欢这个。您还可以记录传递给每个方法的参数、返回值,如果您愿意,甚至可以为嵌套调用添加缩进(如果您需要调试复杂的问题,生成的跟踪结果将非常有用 =D)。


更新:作为一个更有趣的示例,这是典型复合图案示例、几何图形和图形组的迷你版本:http://jsfiddle.net/2YuE7/具有更有趣的跟踪功能。所有数字都理解 move 方法。如果我们有这个复合图形并在其上调用 move:

f = new Composite [
new Rectangle 5, 10, 3, 4
new Composite [
new Circle 0, 0, 2
new Circle 0, 0, 4
new Circle 0, 0, 6
]
]

f.move 2, 3

跟踪输出是:

(Composite[Rectangle[5,10,3,4],Composite[Circle[0,0,2],Circle[0,0,4],Circle[0,0,6]]]).move(2, 3)
| (Rectangle[5,10,3,4]).move(2, 3)
| -> Rectangle[7,13,3,4]
| (Composite[Circle[0,0,2],Circle[0,0,4],Circle[0,0,6]]).move(2, 3)
| | (Circle[0,0,2]).move(2, 3)
| | -> Circle[2,3,2]
| | (Circle[0,0,4]).move(2, 3)
| | -> Circle[2,3,4]
| | (Circle[0,0,6]).move(2, 3)
| | -> Circle[2,3,6]
| -> Composite[Circle[2,3,2],Circle[2,3,4],Circle[2,3,6]]
-> Composite[Rectangle[7,13,3,4],Composite[Circle[2,3,2],Circle[2,3,4],Circle[2,3,6]]]

关于javascript - 记录每个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973181/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com