如何在CoffeeScript类中访问arguments.callee?

时间:2012-12-16 01:47:29

标签: javascript node.js coffeescript

我有以下代码

class Foo 

  a: ->
    console.log arguments.callee.name

  b: ->
    @a()

  c: ->
    @a()


f = new Foo
f.b() #=> should output 'b'
f.c() #=> should output 'c'

问题:如何在班级中获取调用函数的名称?


这是一个用例

class Something extends Stream

  foo: ->
    _helper 'foo', 'a', 'b', 'c'

  bar: ->
    _helper 'bar', 'my neighbor totoro'

  dim: ->
    _helper 'dim', 1, 2, 3

  sum: ->
    _helper 'sum', 'hello', 'world'

  _helper: (command, params...) ->
    @emit 'data', command, params...

something = new Something
something.foo()
something.bar()
# ...

我不想重复发送每次调用私有_helper方法的方法名称

2 个答案:

答案 0 :(得分:1)

所以要清楚,我认为你拥有它的第二种方式是完全合理的,是可行的方法。

但是要回答你的问题,你可以动态生成每个函数,以避免重新输入命令。

class Foo
  commands =
    foo: ['a', 'b', 'c']
    bar: ['my neighbor totoro']
    dim: [1,2,3]

  for own name, args of commands
    Foo::[name] = ->
      @emit 'data', name, args...

并且假设您希望函数成为有用的东西,您仍然可以使用函数。

// ...
  commands =
    foo: (args...) -> return ['a', 'b', 'c']
    // ...

  for own name, cb of commands
    Foo::[name] = (command_args...) ->
      args = cb.apply @, command_args
      @emit 'data', name, args...

答案 1 :(得分:1)

这就是我要做的事情:

class Something extends Stream
    constructor: ->
        @foo = helper.bind @, "foo", "a", "b", "c"
        @bar = helper.bind @, "bar", "my neighbor totoro"
        @dim = helper.bind @, "dim", 1, 2, 3
        @sum = helper.bind @, "sum", "hello", "world"

    helper = (command, params...) ->
        @emit 'data', command, params...

这种方法的优点是:

  1. helper函数是一个私有变量。它不能通过实例直接访问。
  2. helper函数仅声明一次,并在所有实例之间共享。
  3. foobardimsum函数是helper的{​​{3}}。因此,它们不会为函数体消耗更多内存。
  4. 它不需要像@ loganfsmyth那样的回答。
  5. 它更干净。
  6. 编辑:更清晰的方法是:

    class Something extends Stream
        constructor: ->
            @foo = @emit.bind @, "data", "foo", "a", "b", "c"
            @bar = @emit.bind @, "data", "bar", "my neighbor totoro"
            @dim = @emit.bind @, "data", "dim", 1, 2, 3
            @sum = @emit.bind @, "data", "sum", "hello", "world"
    

    当然,它有点多余,但你不能指望像JavaScript这样的语言。这不是partial applications。然而,它是可读的,干净的,易于理解的,最重要的是 - 正确。