CoffeeScript:不使用括号的惰性计算
我试图在我的CoffeeScript代码中创建一种全局单例对象:CoffeeScript:不使用括号的惰性计算,coffeescript,Coffeescript,我试图在我的CoffeeScript代码中创建一种全局单例对象: window.MyLib = Foos: {} Bars: {} Client: -> @_client ||= ( someVar = 'foo' new ExpensiveClient(someVar) ) # ... MyLib.Client.performSomeAction() 但是,代码实际上要求我这样做: MyLib.Client().perform
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
可能不能很好地总结所发生的事情。