W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
許多時候你想要一個,并且只要一個類的實例。比如,你可能需要一個創(chuàng)建服務(wù)器資源的類,并且你想要保證使用一個對象就可以控制這些資源。但是使用時要小心,因為單件模式可以很容易被濫用來模擬不必要的全局變量。
公有類只包含獲得一個實例的方法。實例被保存在該公共對象的閉包中,并且總是有返回值。
這很奏效因為CoffeeScript允許你在一個類的聲明中定義可執(zhí)行的狀態(tài)。但是,因為大多數(shù)CoffeeScript編譯成一個IIFE包,如果這個方式適合你,你就不需要在類的聲明中放置私有的類。之后的內(nèi)容可能對開發(fā)模塊化代碼有所幫助,例如CommonJS(Node.js)或Require.js中可見(見實例討論)。
class Singleton
# You can add statements inside the class definition
# which helps establish private scope (due to closures)
# instance is defined as null to force correct scope
instance = null
# Create a private class that we can initialize however
# defined inside this scope to force the use of the
# singleton class.
class PrivateClass
constructor: (@message) ->
echo: -> @message
# This is a static method used to either retrieve the
# instance or create a new one.
@get: (message) ->
instance ?= new PrivateClass(message)
a = Singleton.get "Hello A"
a.echo() # => "Hello A"
b = Singleton.get "Hello B"
b.echo() # => "Hello A"
Singleton.instance # => undefined
a.instance # => undefined
Singleton.PrivateClass # => undefined
通過上面的實例我們可以看到,所有的實例是如何從同一個Singleton類的實例中輸出的。你也可以看到,私有類和實例變量都無法在Singleton class外被訪問到。 Singleton class的本質(zhì)是提供一個靜態(tài)方法得到只返回一個私有類的實例。它也對外界也隱藏私有類,因此你無法創(chuàng)建一個自己的私有類。
隱藏或使私有類在內(nèi)部運作的想法是更受偏愛的。尤其是由于缺省的CoffeeScript將編譯的代碼封裝在自己的IIFE(閉包)中,你可以定義類而無須擔(dān)心會被文件外部訪問到。在這個實例中,注意,用慣用的模塊導(dǎo)出特點來強調(diào)模塊中可被公共訪問的部分。(請看“導(dǎo)出到全局命名空間”中對此理解更深入的討論)。
root = exports ? this
# Create a private class that we can initialize however
# defined inside the wrapper scope.
class ProtectedClass
constructor: (@message) ->
echo: -> @message
class Singleton
# You can add statements inside the class definition
# which helps establish private scope (due to closures)
# instance is defined as null to force correct scope
instance = null
# This is a static method used to either retrieve the
# instance or create a new one.
@get: (message) ->
instance ?= new ProtectedClass(message)
# Export Singleton as a module
root.Singleton = Singleton
我們可以注意到coffeescript是如此簡單地實現(xiàn)這個設(shè)計模式。為了更好地參考和討論JavaScript的實現(xiàn),請看初學(xué)者必備 JavaScript 設(shè)計模式。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: