1

这是我之前的问题Javascript: ReferenceError: MyClass is not defined的后续。

将此转换为 .js 的 .coffee 文件将MyClass在其范围内创建一个可用的文件。

class MyClass
    name: (name) -> 

CoffeScript 中有没有办法使该类可用于外部范围?我应该能够<script src..将文件放在 HTML 页面上并从控制台实例化该类。

4

2 回答 2

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();

有道理?

于 2012-11-17T22:21:58.147 回答
1

这个 stackoverflow提供了一个非常全面的使用咖啡脚本创建全局对象的概述,其中包括一些非常好的示例。

对于此示例,咖啡脚本:

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

将编译为:

var MyClass;

window.MyClass = MyClass = (function() {

  function MyClass() {}

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

  return MyClass;

})();

这将给出与您之前问题的答案相同的行为。

于 2012-11-17T22:09:45.913 回答