我有以下代码
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
方法的方法名称
答案 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...
这种方法的优点是:
helper
函数是一个私有变量。它不能通过实例直接访问。helper
函数仅声明一次,并在所有实例之间共享。foo
,bar
,dim
和sum
函数是helper
的{{3}}。因此,它们不会为函数体消耗更多内存。编辑:更清晰的方法是:
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。然而,它是可读的,干净的,易于理解的,最重要的是 - 正确。