为什么CoffeeScript的包装在封闭的类定义?(Why does CoffeeScript w

2019-06-27 03:11发布

在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个字节是傻种无关,但与许多许多类项目,头顶开始积少成多。

好吧,我写了下面驳斥字节大小的理论答案...任何合理的类,咖啡的方法将是较小的。

很可能有其他原因了。 帮我想他们的。

Answer 1:

杰里米在一个相关的问题回答了这个过 -它看起来像的主要目的是为了避免触发IE的bug。



Answer 2:

另一个原因是与闭合包装类定义是给这些代码一个新的词汇范围,声明变量和的东西,只有在类中可见:

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.

在代码中,变量doSomethingAwesomei是局部的类定义,从而使他们的“私人”外部用户。

如果IMO不需要局部变量的CoffeeScript的编译器可以删除多余的包装。 但始终包裹类的定义可能是从实现的角度来看简单的:)



Answer 3:

我真的不知道CS是如何工作的,除了一个事实,即它只是转换成JS,但我看到它的方式, 模块模式支持私有成员容易 ,其原型模式不(或通常很难做到) 。 我认为,这是最主要的原因,模块模式是使用的模式。



Answer 4:

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种方法和优势将切换到咖啡。 而且它不只是方法; 类常量和其他裁判类型算过。



文章来源: Why does CoffeeScript wrap class definitions in a closure?