1

我有以下代码

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方法重复发送方法名称

4

2 回答 2

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. 函数foo,bar和是dim部分应用。因此,它们不会为函数体消耗更多内存。sumhelper
  4. 它不需要像@loganfsmyth 的答案那样的循环。
  5. 它更干净。

编辑:更清洁的方法是:

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 这样的语言有更多期望。这不是因素。然而,它是可读的、干净的、易于理解的,而且最重要的是——正确的。

于 2012-12-16T02:41:09.347 回答
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...
于 2012-12-16T02:04:45.393 回答