Por que o CoffeeScript quebra as definições de classe em um encerramento?

No CoffeeScript,isto:

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

Compila para:

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

Que parece um pouco excessivo. O seguinte deve serfuncionalmente idêntico:

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

Qual é a motivação para o wrapper de "fechamento" extra?

Esta não é apenas uma questão inútil de estilo; isso tem implicação para o tamanho geral do código.

A versão do café é reduzida em 84 bytes:

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

Minha versão é reduzida em apenas 61 bytes:

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

23 bytes é um tipo tolo de irrelevante, mas em um projeto com muitas classes, a sobrecarga começa a somar.

Ok, eu escrevi uma resposta abaixo refutando a teoria do tamanho dos bytes ... para qualquer classe razoável, o método do Café será menor.

Há provavelmente outras razões também. Me ajude a pensar neles.

questionAnswers(4)

yourAnswerToTheQuestion