Почему CoffeeScript заключает определения классов в замыкание?
В CoffeeScript,этот:
class Foo
method: (x) ->
x+1
Компилируется в:
// Generated By CoffeeScript
Foo = (function() {
function Foo() {}
Foo.prototype.method = function(x) {
return x+1;
}
return Foo;
})()
Который кажется немного чрезмерным. Следующее должно бытьfunctionally identical:
// Generated by Dave
function Foo() {}
Foo.prototype.method = function(x) {
return x+1;
}
What is the motivation for the extra "closure" wrapper?
Это не просто праздный вопрос стиля; это имеет значение для общего размера кода.
Версия 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 bytes is silly kinds of irrelevant, but in a project with many many classes, overhead begins to add up.
Хорошо, я написал ответ ниже, опровергающий теорию размера байта ... для любого разумного класса метод Coffee будет меньше.
Возможно, есть и другие причины. Помоги мне подумать о них.