2011-05-24 7 views
14

Coffeescriptを掘る自分のJavascriptファイルをCoffeescriptに移植しようとしています。隠された変数を持つCoffeescriptのモジュールパターン

これについては、私は(「プライベート」変数を維持するために結合閉鎖)Doulgasクロックフォードのモジュールのパターンに関連した質問を

したがって、私の質問をされてい:何だろう、次のJSの一見のためaquivalentのCoffeeScript like:

var test = function() { var hidden = 'open'; return { open: hidden }; }(); 

Coffeescriptではこのパターンとは異なる/より良いアプローチがありますか?

答えて

5

CoffeeScript(または、むしろcoffeeスクリプト)は、コードを匿名関数内に自動的にラップします。

匿名クロージャからオブジェクトを公開する必要がある場合は、それらを明示的にルートオブジェクトに割り当てることができます。いくつかのポインタについては、Underscore.coffeeの先頭を参照してください。

http://jashkenas.github.com/coffee-script/documentation/docs/underscore.html

17

私は最善のアプローチは、(ループ-参照私のPragPub articleを内の値をキャプチャするために主に存在する)doキーワードの助けを借りて、文字通りのCoffeeScriptにあなたの例を翻訳することであると思う:

test = do -> 
    hidden = 'open' 
    open: hidden 

これが以外にあなたのコードと同じです

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 
    return { 
    open: hidden 
    }; 
})(); 

にコンパイルフォーマット。 (CoffeeScriptコンパイラは、すべてのvar宣言をスコープの先頭に自動的に配置します。これにより、JavaScript出力を調べることによって変数のスコープを簡単に判断できます)。

+0

"これは主にループ内の値を取り込むために存在します。" <不一致。間違いなく最も混乱しやすい/混乱する機能の一つであると思われる。 – matyr

+0

Matyr、それを説明できますか? doキーワードは、私のローカルスコープ内の値を取得するように見えます。 – Geoff

+0

@matyr最初にそれを提案したときに 'do'の意図した目的ではありませんでしたが、Jeremyが(断ち切れば)CoffeeScriptにそれを追加したのは確かです。 [issue 959](https://github.com/jashkenas/coffee-script/issues/959)を参照してください。これは、[公式ドキュメント](http://jashkenas.github.com/coffee-script/#loops)に 'do'が表示される唯一のコンテキストです。 –

6

coffeescript wikiに、名前空間を扱います。それは

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript

のCoffeeScriptは匿名関数内のすべてのソースコードファイルを囲むのそれより上のネイティブモジュールシステムを持っていない(と思う)かなりelegentです。しかし、ちょっとしたトリッキーなことで、Rubyの羨望のモジュールを手に入れることができます。モジュールヘルパーの実装はあなたが好きな場合は、別のソースファイルに置くことができ

window.module = (name, fn)-> 
    if not @[name]? 
    this[name] = {} 
    if not @[name].module? 
    @[name].module = window.module 
    fn.apply(this[name], []) 

ある

@module "foo", -> 
    @module "bar", -> 
     class @Amazing 
      toString: "ain't it" 

以下のように は、私は私のモジュールを定義します。その後、私はあなたが単一であなたのモジュールを書くことができた場合は、以下のジャスミンが私 モジュールシステム

@module "test", -> 
    hidden = 10 
    @open = hidden 

describe "test", -> 
    it "has no hidden", -> 
    expect(test.hidden?).toEqual false 

    it "has open", -> 
    expect(test.open?).toEqual true 
+1

そのWikiページ(https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript)は存在しないようです。 –

1

を使用してそれに答えるスペックだと思うあなたの特定の質問に名前空間のモジュールによって

x = new foo.bar.Amazing 

WRTをあなたのクラスにアクセスすることができますクラスを選択して、-bオプションでcoffeescriptをコンパイルすると、探しているモジュールパターンが自然に作成されます。

この:

class test 
    hidden = 'open' 
    open: hidden 

はこれにコンパイルさ:非常に近いあなたが探していたものです

var test; 
test = (function() { 
    var hidden; 
    hidden = 'open'; 

    test.prototype.open = hidden; 

    return test; 
})(); 

関連する問題