3

MarkdownDeep をモックしたいのですが、JavaScript で次のコードを作成しました。

MarkdownDeep = new (function () {
    this.Markdown = function () {
        this.Transform = function (a) {
            return "html";
        };
    };
})();

しかし、これをCoffeeScriptで実装するのに問題があります

私は次のことを試しました

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
)()
window.MarkdownDeep = MarkdownDeep

特に私の単体テストでは、markdown = new MarkdownDeep.Markdown()「未定義は関数ではありません」と表示されますが、JSバージョンは正常にモックアウトされます。

4

5 に答える 5

3

この例では、次の JavaScript コードが生成されます。

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});
window.MarkdownDeep = MarkdownDeep;

この行return this.Markdown = function() { /* ... */ }は、関数を演算子によって返されるオブジェクトにしますnew

書き込み

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    return
  return
)
window.MarkdownDeep = MarkdownDeep

問題を修正します。

追加: この回答は、javascriptでのオブジェクト構築のアルゴリズムについて言及しています

于 2011-10-16T22:45:38.787 に答える
2

CoffeeScript の暗黙の戻り値は、 と組み合わせて使用​​すると騒乱につながる可能性がありますnew。他の人が指摘したように、明示的なリターンを使用できます。もう 1 つのオプションは、 を使用することです。これは、暗黙的な戻り値のないclass関数 ( ) を作成します。constructor

MarkdownDeep = new class
  constructor: ->
    @Markdown = class
      constructor: ->
        @Transform = (a) ->
          'html'

もちろん、この場合はあまり読みやすくありませんが、原則として、 を使用するclassたびに を使用することで頭痛の種から解放されますnew

于 2011-10-16T22:48:29.063 に答える
0

オブジェクト/クラスの戻り値を明示的に設定する必要があります。そうしないと、新しいインスタンスを作成するときにメンバー関数が返されます。

JSフィドル

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    undefined #return undefined instead of this.Transform
  undefined #return undefined instead of this.Markdown
)

markdown = new MarkdownDeep.Markdown()
alert markdown.Transform()

コンパイルすると:

var MarkdownDeep, markdown;
MarkdownDeep = new (function() {
  this.Markdown = function() {
    this.Transform = function(a) {
      return "html";
    };
    return;
  };
  return;
});
markdown = new MarkdownDeep.Markdown();
alert(markdown.Transform());
于 2011-10-16T22:48:23.523 に答える
0

これはCoffeescriptが出力として与えるものです

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});

すべての関数の最後の行は、Coffeescript で暗黙的に返されます。コンソールでこれを確認すると、MarkdownDeep が次のように生成されます。

function () {
    return this.Transform = function(a) {
        return "html";
    };
}

メソッドとして Markdown() を持たない関数を返します。

于 2011-10-16T22:49:38.267 に答える
-2

CoffeeScript は、各出力ファイルを無名関数 ( (function() { ... })()) で自動的にラップします。これを無効にするには、実行時に--bareまたは-bオプションを使用しますcoffee

于 2011-10-16T22:39:55.297 に答える