@对coffeescript类名做什么

时间:2013-11-12 15:15:28

标签: class coffeescript

因此,对于咖啡脚本而言,我必须相当快地学习新工作。以下代码之间的区别是什么:

class Person

class @Person

如果我使用以下

bob = new Person() 

结果会有何不同?

2 个答案:

答案 0 :(得分:0)

@适用于this,因此class @Person已编译为this.Person = ...

您可以在js2coffee

查看已编译的JS的内容

答案 1 :(得分:0)

如果您查看class Cclass @C生成的完整JavaScript,事情应该更清晰。 class C成为(通过一些清理):

(function() {
  var C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

因此C“class”实际上是自调用函数(SIF)包装器中的局部变量。这个包装器是CoffeeScript处理scoping

的一部分
  

虽然为了清楚起见在本文档中进行了限制,但所有CoffeeScript输出都包含在一个匿名函数中:(function(){ ... })();此安全包装器与自动生成var关键字相结合,使得污染非常困难意外的全局命名空间。

如果我们查看class @C,我们会看到几乎相同的事情:

(function() {
  this.C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

区别在于var C(局部变量)与this.Cthis上的属性)。

那么SIF内的this是什么?内部的this将是它外面的任何东西:

(function() { ... }).call(this)
// -----------------------^^^^

因为call用于调用SIF。 this在SIF之外的内容是什么?在浏览器中,它为window,因此class @C等同于class window.Cwindow的属性全局可见;因此,class @C会使C在浏览器环境中全局可见,而简单的class C只会在定义它的文件中可见。

更常见的方法(至少在我使用过的代码中)是拥有一个全局可见的特定于应用程序的命名空间:

// Somewhere before anything else happens...
window.whatever_the_app_is_called = { };

然后将您的类放在该命名空间中的某个位置:

class whatever_the_app_is_called.C
    #...

如果你使用的是Require.js或node.js,那么他们就有你自己的命名空间模式。