8

CoffeeScript では、次のようになります。

class Foo
  method: (x) ->
    x+1

コンパイルすると:

// Generated By CoffeeScript
Foo = (function() {
  function Foo() {}
  Foo.prototype.method = function(x) {
    return x+1;
  }
  return Foo;
})()

これは少し過剰に思えます。以下は機能的に同一である必要があります。

// Generated by Dave
function Foo() {}
Foo.prototype.method = function(x) {
    return x+1;
}

追加の「クロージャー」ラッパーの動機は何ですか?

これは単なるスタイリングの問題ではありません。これは、全体のコード サイズに影響します。

Coffee バージョンは 84 バイトに縮小されます。

Foo=function(){function e(){}return e.prototype.method=function(e){return e+1},e}();

私のバージョンは 61 バイトのみに縮小されます。

function Foo(){}Foo.prototype.method=function(e){return e+1};

23 バイトはばかげた種類の無関係ですが、多くのクラスを含むプロジェクトでは、オーバーヘッドが増え始めます。

わかりました、バイトサイズ理論に反論する答えを以下に書きました...合理的なクラスでは、Coffeeメソッドは小さくなります。

他にも理由がありそうです。それらについて考えるのを手伝ってください。

4

4 に答える 4

2

Jeremyは、関連する質問でこれに答えています。主な目的は、IEのバグのトリガーを回避することであるようです。

于 2012-08-18T18:20:25.733 に答える
2

OK、私は自分の質問に答えたと思います。

ほとんどの合理的なクラスでは、CoffeeScript によって生成されたクロージャーは、縮小された小さな出力を生成します。

クロージャ ラッパーは 25 バイトのオーバーヘッドを削減しますが、classname を繰り返す必要がなくなり、バイトを節約できk * Nます (k=letters-in-name、N=num-of-refs)。たとえば、ようなクラスBoilerPlateThingyFactoryに 2 つ以上のメソッドがある場合、クロージャ ラッパーはより小さな縮小コードを生成します。



さらに詳細に...

クロージャを使用して Coffee によって生成されたコードは、次のように縮小されます。

// Uglify '1.js' = 138 bytes (197 w/ whitespace):

var Animal=function(){function e(e){this.name=e}return e.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e},e}();

// with whitespace ("uglifyjs -b"):

var Animal = function() {
    function e(e) {
        this.name = e;
    }
    return e.prototype.speak = function(e) {
        return "My name is " + this.name + " and I like " + e;
    }, e;
}();

別の実装では、次のように縮小されます。

// Uglify '2.js' = 119 bytes (150 w/ whitespace):

var Animal=function(t){this.name=t};Animal.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e};

// with whitespace ("uglifyjs -b"):

var Animal = function(t) {
    this.name = t;
};

Animal.prototype.speak = function(e) {
    return "My name is " + this.name + " and I like " + e;
};

"Animal" という名前が、Coffee 形式では正確に 1 回存在し、別の実装では N=2 回存在することに注意してください。現在、「アニマル」は 6 文字のみで、メソッドは 1 つしかないため、ここのコーヒーは 25-6 = 19 バイト負けるはずです。縮小されたコードを調べると、デルタが ... 19 バイトの場合、138 バイトから 119 バイトです。さらに4つの方法を追加すると、利点がコーヒーに切り替わります. そしてそれはメソッドだけではありません。クラス定数やその他の参照型もカウントされます。

于 2012-08-18T01:34:18.523 に答える