这是对我上一个问题Javascript: ReferenceError: MyClass is not defined的跟进。
转换为.js的.coffee文件将仅在其范围内创建MyClass
。
class MyClass
name: (name) ->
CoffeScript中是否有办法使类可用于外部作用域?我应该能够<script src..
HTML页面上的文件,并从控制台实例化该类。
答案 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;
})();
这将给出与上一个问题的答案相同的行为。