在CoffeeScript中定义外部作用域的类

时间:2012-11-17 22:04:21

标签: javascript coffeescript

这是对我上一个问题Javascript: ReferenceError: MyClass is not defined的跟进。

转换为.js的.coffee文件将仅在其范围内创建MyClass

class MyClass
    name: (name) -> 

CoffeScript中是否有办法使类可用于外部作用域?我应该能够<script src.. HTML页面上的文件,并从控制台实例化该类。

2 个答案:

答案 0 :(得分:3)

无论你怎么做,你都会“污染全球范围”。这只是你如何做的问题。

CoffeeScript中的@符号用于表示“此范围”。所以你甚至可以在Class定义中使用它。类声明的结果是该类是在window对象的范围内定义的(除非有其他一些情况,但这不太可能在你在这里描述的内容)。

class @CustomClassName
    constructor: -> 
        # constructor stuff goes down...

但是,我个人喜欢使用命名空间。 想想google.maps.Map或者您是否曾编写过Actionscript 3:flash.display.MovieClip

在CoffeeScript文件的顶部放置了以下内容:

window.customnamespace = window.customnamespace || {}

现在,当您创建课程时,您可以说:

class customnamespace.ClassName
    constructor: (container) ->
        # set the container
        @container = container
        # etc...

class customnamespace.OtherClassName
    constructor: ->
        # Another class...

document.ready中(如果您使用的是jQuery),您将全局访问该命名空间及其所有类。

示例:

$(document).ready(function(e) {
    var c = new customnamespace.ClassName($('#container'));

    var other = new customnamespace.OtherClassName();

有意义吗?

答案 1 :(得分:1)

This stackoverflow给出了使用coffeescript创建全局对象的非常全面的概述,其中包含一些非常好的示例。

对于这个例子,coffeescript:

window.MyClass = class MyClass
    name: (name) -> 

将编译为:

var MyClass;

window.MyClass = MyClass = (function() {

  function MyClass() {}

  MyClass.prototype.name = function(name) {};

  return MyClass;

})();

这将给出与上一个问题的答案相同的行为。