在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;
}
什么是多余的“封闭”包装的动机是什么?
这不仅是造型的闲置问题; 它蕴涵于整个代码大小。
咖啡版本minifies到84个字节:
Foo=function(){function e(){}return e.prototype.method=function(e){return e+1},e}();
我的版本minifies到只有61字节:
function Foo(){}Foo.prototype.method=function(e){return e+1};
23个字节是傻种无关,但与许多许多类项目,头顶开始积少成多。
好吧,我写了下面驳斥字节大小的理论答案...任何合理的类,咖啡的方法将是较小的。
很可能有其他原因了。 帮我想他们的。
杰里米在一个相关的问题回答了这个过 -它看起来像的主要目的是为了避免触发IE的bug。
另一个原因是与闭合包装类定义是给这些代码一个新的词汇范围,声明变量和的东西,只有在类中可见:
class AwesomeThing
# You might have private "methods" here.
doSomethingAwesome = (what) ->
console.log "I'm doing #{what} like a pro!"
# Or run any arbitrary code.
for i in [1..10]
@prototype["uselessMethod#{i}"] = -> 'nothing'
beAwesome: ->
doSomethingAwesome @uselessMethod5() # The 5'th useless method is the best.
在代码中,变量doSomethingAwesome
和i
是局部的类定义,从而使他们的“私人”外部用户。
如果IMO不需要局部变量的CoffeeScript的编译器可以删除多余的包装。 但始终包裹类的定义可能是从实现的角度来看简单的:)
我真的不知道CS是如何工作的,除了一个事实,即它只是转换成JS,但我看到它的方式, 模块模式支持私有成员容易 ,其原型模式不(或通常很难做到) 。 我认为,这是最主要的原因,模块模式是使用的模式。
OK,我想我只是回答了我的问题。
对于最合理的类,由CoffeeScript的所产生的闭合产生较小的缩小的输出。
封闭包装为25个字节缩小的开销,但它从重复类名 ,节省您节省 k * N
字节(K =字母式名称,N = NUM-的-裁判)。 例如,如果像类BoilerPlateThingyFactory
具有2+的方法,封闭件的包装生成较小缩小的代码。
详细...
的咖啡产生的代码使用闭合minifies到:
// 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;
}();
另一种方法实现minifies这样:
// 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;
};
注意名“动物”名称如何在咖啡形式精确地一次存在,和N =在替换实现2倍。 现在,“动物”是只有6个字母,而且也只有1的方法,所以在这里咖啡应该由25-6 = 19个字节丢失。 咨询我minified的代码,它是138个字节到119个字节,为... 19个字节的增量。 添加4种方法和优势将切换到咖啡。 而且它不只是方法; 类常量和其他裁判类型算过。