1

我正在尝试在我的 CoffeeScript 代码中创建一种全局的单例对象:

window.MyLib = 
  Foos: {}
  Bars: {}
  Client: ->
    @_client ||= (
      someVar = 'foo'
      new ExpensiveClient(someVar)
    )

# ...


MyLib.Client.performSomeAction()

但是,代码实际上需要我这样做:

MyLib.Client().performSomeAction()

如何解决实现惰性实例化的问题,而无需使用括号将其作为函数调用?

更新:或者,如果有一种方法可以实现某种“缺少方法”,该Client函数可以返回一个将职责委托给实际客户端的对象,但仅在需要时实例化它。

4

1 回答 1

3

也许是这样的:

lazyGet = (obj, name, property) ->
  Object.defineProperty obj, name, get: property

window.MyLib = do ->
  @_client = null

  Foos: {}
  Bars: {}

  lazyGet this, 'Client', ->
    @_client ||= (
      someVar = 'foo'
      new ExpensiveClient someVar
    )
于 2013-04-22T22:05:50.057 回答