2

私のコード

切り取られた小さなCoffeScriptコードがあります:

Function::trigger = (prop, getter, setter) ->
      Object.defineProperty this.prototype
              get: getter,
          set: setter

JavaScriptのコンパイル

コンパイラーは以下を出力します:

Function.prototype.trigger = function(prop, getter, setter) {
  Object.defineProperty(this.prototype({
    get: getter
  }));
  return {
    set: setter
  };
};

しかし、私は出力を次のようにしたいと思います。

Function.prototype.trigger = function(prop, getter, setter) {
  Object.defineProperty(this.prototype({
    get: getter
    set: setter
  };
};

私の質問

  • なぜコンパイラは奇妙なものを出力するのですか?
  • コンパイラに必要なものを出力させるために、コードを変更するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

4

インデントが間違っています。また、this.prototypeの後にコンマを忘れたことにも注意してください。これにより、CoffeeScriptコンパイラは、オブジェクトを引数としてthis.prototypeという名前の関数を実行しようとしていると見なします。

Function::trigger = (prop, getter, setter) ->
      Object.defineProperty this.prototype
              get: getter,
          set: setter

上記のコードは次のようになります。より「CoffeeScriptのような」ものにするためにいくつかの変更を加えたことに注意してください:)

Function::trigger = (prop, getter, setter) ->
    Object.defineProperty @::,
        get: getter
        set: setter

CoffeeScriptは空白文字であることに注意してください。CoffeeScriptは、JavaScriptに見られる多くの「綿毛」(コンマ、括弧、中括弧など)も削除します。このため、CoffeeScript標準に準拠するようにコードをフォーマットすることは、期待どおりにコンパイルするコードを作成するために不可欠です。そうしないと、コンパイラはあなたが何をしようとしていたかを推測することを余儀なくされ、それはしばしば間違っています。

上記の例は、次のJavaScript(coffeescript.orgに基づく)に正しくコンパイルされます...

Function.prototype.trigger = function(prop, getter, setter) {
  return Object.defineProperty(this.prototype, {
    get: getter,
    set: setter
  });
};

CoffeeScriptは最後に実行された式(この場合はObject.definePropertyの呼び出し)を自動的に返すことに注意してください。この動作を回避したい場合(すべきではありませんが、必要な場合もあります)、Function.prototype.trigger関数の最後にreturnステートメントを追加するだけです。

Function::trigger = (prop, getter, setter) ->
    Object.defineProperty @::,
        get: getter
        set: setter

    return

コンパイルされます...

Function.prototype.trigger = function(prop, getter, setter) {
  Object.defineProperty(this.prototype, {
    get: getter,
    set: setter
  });
};
于 2012-07-20T19:26:05.037 に答える