Класс coffeescript недоступен в основном javascript

У меня есть класс, написанный в coffeescript, например,

class Example
  constructor: ->
    $.each [1, 2, 3], (key, value) =>
      @test = value
    return @test
  render: ->
    alert @test

и я имею этот класс как отдельный файл, Example.coffee

Теперь я хочу иметь возможность создавать экземпляр в моем основном файле javascript, например:

d = new Example
d.render()

но класс undefined, даже если он включен как script на странице, например

<script src="Example.js></script>
<script src="main.js"></script>

Как сделать класс общедоступным для основного файла?

Ответ 1

Вы можете объявить свой класс доступным по всему миру (по крайней мере для браузеров), объявив его в пространстве имен window:

class window.Example
  constructor: ->
    $.each [1, 2, 3], (key, value) =>
      @test = value
    return @test
  render: ->
    alert @test

Это положит Example прямо в window. Вы также можете сказать class @Example в большинстве случаев.

По умолчанию CoffeeScript обертывает каждый файл в обертке (function() { ... })(), чтобы предотвратить загрязнение пространства имен. Это можно предотвратить, предоставив -b при компиляции вашего CoffeeScript:

-b, --bare
Скомпилируйте JavaScript без оболочки безопасности верхнего уровня.

но это может быть не вариант для вас (или он может быть уродливым). Обычный подход заключается в том, чтобы объявить конкретное пространство приложений где-то до загрузки ваших классов:

// Probably in a <script> in your top-level HTML...
App = { };

а затем соответствующим образом просуммируйте ваши классы:

class App.Example
    #...

Затем обратитесь ко всему через пространство имен App.

Ответ 2

Я знаю, что это старый поток, но если кто-то найдет его полезным, объявите свой класс с помощью "@", и он будет доступен для файлов .js вне файла .coffee.

Итак, в example.coffee:

class Introverted
  honk: ->
    alert "This class is visible within the .coffee file but not outside"

class @Extroverted
  honk: ->
    alert "This class is visible inside and outside of the .coffee file"

Это скомпилировано в example.js, которое затем можно использовать в example.html:

<script src="example.js"></script>
<script>
var p = new Extroverted(); // works fine
p.honk();

var i = new Introverted(); // will fail with "Introverted is not defined"
i.honk();
</script>

Ответ 3

Создать глобальную переменную

window.Example = Example