1

假设我有一个像这样的对象(使用coffeescript):

class Client
  constructor: (socket) ->
    @id     = socket.id
    @socket = socket
    # some other initialization here...

现在,每当@socket 发出某些东西时,我希望客户端对象通过发出相同的事件来模仿它。我想不出更好的方法来做到这一点,而不是只监视@socket 发出的每个事件并在 Client 类中手动发出它,即:

class Client
  constructor: (socket) ->
    # ...
    @socket.on('disconnection', onDisconnect)
    @socket.on('message', onMessage)

  onDisconnect: ->
    this.emit('disconnection')

  onMessage: (data) ->
    this.emit('message', data)

我知道必须有更好的方法,但我不知道该怎么做。

4

2 回答 2

0

猴子补丁@socket对象发出:

class Client
  constructor: (socket) ->
    @reEmit(socket)

  reEmit: (ee)->
    oldEmit = ee.emit
    ee.emit = (args...)=>
      @emit(args)       
      oldEmit.apply(ee, args)
于 2012-09-08T23:03:50.423 回答
0

像这样的东西?(未经测试。)

class Client

  constructor: (socket) ->
    # ...
    for event in ['disconnect', 'message']
      @socket.on(event, => @emit(event, arguments))
于 2012-09-08T15:06:06.540 回答