2013-08-30 50 views
0

在coffeescript中,您可以通過將定義與@符號相加來爲全局命名空間分配一個對象或類。將@分配給單獨的對象以便於命名空間

例如

class @Dog #This is now available via window.Dog due to the @ 
    constructor :() -> 

但有好歹給@符號分配的,而不是窗口到另一個對象,?

當我試圖@ = {},我error: unexpected =

這將允許你總是定義你的對象是一個命名空間,但是改變了主意什麼命名空間是在稍後的時間。它可以讓你避免以個案爲基礎的出口。您可以在測試時將@設置爲全局,然後在部署時將其設置爲備用名稱空間。

如果有更好的方法,或者實現類似目標的另一種方法,那也將非常棒!

回答

1

不能指定的東西this,this是範圍變量。

您可以進行一些功能設置的命名空間:

@scope = do (-> return @) #change `@` at the end to your namespace 

然後,你會怎麼做:

class @scope.Dog 
    constructor:() -> 
     ... 

,它解析到:

this.scope = (function() { 
    return this; 
})(); 

this.scope.Dog = (function() { 

    function Dog() { 
     ... 
    } 

    return Dog; 

})(); 
+0

我喜歡這種方式謝謝。我最終在代碼的頂部定義了一個簡單的對象'scope = @',從那個文檔中的所有東西都被定義爲'scope.Dog'。您可以隨時輕鬆更改所有對象的名稱空間,並且您的代碼的任何讀者都可以輕鬆地看到發生了什麼。 將'@ scope'作爲一個函數(而不是對象)來定義我缺少的優點嗎? –

0

你不能在頂層更改this,但您c一個call a function具有不同this範圍:

(-> 
    class @Dog 
    talk: -> console.log 'woof!' 
    class @Cat 
    talk: -> console.log 'meow' 
).call animals = {} 

# Now the animals "namespace" has a Cat and a Dog properties. 
(new scope.Cat).talk() 

的示例沒有太大的意義,因爲它可以寫成animals = {}; class animals.Cat和避免額外的嵌套層次的需求,但如果你正在尋找改變在this動態在某些時候,它很高興知道的Function#call存在:)

0

使用@作爲參考窗口對象可能是誤導性的,可能會導致錯誤(當環境的變化)。更好的是聲明一些自定義命名空間。

你把線在第一個腳本你加載:

window.myns ?= {} 

...後來用它代替@這樣的:

class myns.Dog 

您添加爲安全起見名稱空間聲明行放在每個文件的頂部,您將在其中進行修改。但這不是強制性的。只要確保腳本按正確的順序加載即可。

相關問題