这是我之前的问题Javascript: ReferenceError: MyClass is not defined的后续。
将此转换为 .js 的 .coffee 文件将MyClass
在其范围内创建一个可用的文件。
class MyClass
name: (name) ->
CoffeScript 中有没有办法使该类可用于外部范围?我应该能够<script src..
将文件放在 HTML 页面上并从控制台实例化该类。
这是我之前的问题Javascript: ReferenceError: MyClass is not defined的后续。
将此转换为 .js 的 .coffee 文件将MyClass
在其范围内创建一个可用的文件。
class MyClass
name: (name) ->
CoffeScript 中有没有办法使该类可用于外部范围?我应该能够<script src..
将文件放在 HTML 页面上并从控制台实例化该类。
不管你怎么做,你都会“污染全球范围”。这只是你如何做的问题。
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();
有道理?
这个 stackoverflow提供了一个非常全面的使用咖啡脚本创建全局对象的概述,其中包括一些非常好的示例。
对于此示例,咖啡脚本:
window.MyClass = class MyClass
name: (name) ->
将编译为:
var MyClass;
window.MyClass = MyClass = (function() {
function MyClass() {}
MyClass.prototype.name = function(name) {};
return MyClass;
})();
这将给出与您之前问题的答案相同的行为。