0

coffeescript では、@シンボルを定義の先頭に追加することで、オブジェクトまたはクラスをグローバル名前空間に割り当てることができます。

例えば

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

@しかし、ウィンドウの代わりにシンボルを別のオブジェクトに割り当てる方法はありますか?

私が試したとき@ = {}、私は得ましたerror: unexpected =

これにより、オブジェクトを常に名前空間として定義できますが、後でどの名前空間であるかについて考えを変えることができます。ケースバイケースでエクスポートを回避できます。テスト中に @ をグローバルに設定し、デプロイ時に別の名前空間に設定できます。

より良いアプローチ、または同様の目標を達成するための別の方法があれば、それも素晴らしいでしょう!

4

3 に答える 3

1

に何かを割り当てることはできません。 はスコープ変数です。thisthis

名前空間を設定する関数を作成できると思います。

@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;

})();
于 2013-08-30T13:17:06.137 に答える
0

thisトップレベルで を変更することはできませんが、別のスコープで関数を呼び出すことができます: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

于 2013-08-31T23:58:53.740 に答える
0

ウィンドウオブジェクトへの参照として @ を使用すると、誤解を招く可能性があり、エラーが発生する可能性があります (コンテキストが変更された場合)。いくつかのカスタム名前空間を宣言することをお勧めします。

ロードする最初のスクリプトに次の行を追加します。

window.myns ?= {}

...そして後で @ like の代わりに使用します:

class myns.Dog

安全のために、参照する各ファイルの先頭に名前空間宣言行を追加してください。ただし、必須ではありません。スクリプトが適切な順序でロードされていることを確認してください。

于 2013-09-02T14:04:40.773 に答える