Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CoffeeScript:不使用括号的惰性计算_Coffeescript - Fatal编程技术网

CoffeeScript:不使用括号的惰性计算

CoffeeScript:不使用括号的惰性计算,coffeescript,Coffeescript,我试图在我的CoffeeScript代码中创建一种全局单例对象: window.MyLib = Foos: {} Bars: {} Client: -> @_client ||= ( someVar = 'foo' new ExpensiveClient(someVar) ) # ... MyLib.Client.performSomeAction() 但是,代码实际上要求我这样做: MyLib.Client().perform

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

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

# ...


MyLib.Client.performSomeAction()
但是,代码实际上要求我这样做:

MyLib.Client().performSomeAction()
如何避免实现延迟实例化的问题,而不需要使用括号将其作为函数调用


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

可能类似这样:

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
    )

因此,您希望在每次访问
客户端时运行该函数,与?或者至少是相同的答案。@phenomnomnominal Yes,为了防止从一开始就实例化
客户机
,将其包装在函数中,并且仅在第一次调用时实例化,以防止不必要的
ExpensiveClient
被创建(如果不需要的话)。请支持创造性,但这不是我希望在生产环境中遇到的问题。这看起来很接近我要做的事情,但是你能更详细地解释一下这一行吗
Object.defineProperty obj,name,get:property
只是定义对象属性的另一种方法。它的一部分允许您指定
get
set
如何处理该属性。这里我们只是将“Singleton”函数分配给
get
访问器,以便在访问属性时调用它。就像@MichielKalkman所说的,它可能会引起一些人的注意,所以如果你真的使用了它,请多加评论。而且,
lazyGet
可能不能很好地总结所发生的事情。