2016-01-21 3 views
2

Я учусь CoffeeScript у меня есть этот код:Почему coffescript создание этого закрытия

class Person 
    constructor: (@firstName, @lastName) -> 
    sayHi:() -> 
     return "Hi, I'm #{@firstName} #{@lastName}" 

И генерирует этот яваскрипта код:

// Generated by CoffeeScript 1.10.0 
(function() { 
    var Person; 

    Person = (function() { 
    function Person(firstName, lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    Person.prototype.sayHi = function() { 
     return "Hi, I'm " + this.firstName + " " + this.lastName; 
    }; 

    return Person; 

    })(); 

}).call(this); 

Я хочу, чтобы создавать экземпляры этого class, но потому что он внутри закрытия, я не могу, как мне это сделать?

+0

Следует упомянуть, что вы используете 'node.js'? –

+0

Я не использую 'node'. Просто «npm» для установки некоторых пакетов, но это просто приложение для конечного пользователя. – Pablo

+0

Я хочу запускать тесты жасмина по этому поводу, но когда я 'требую' файл js, Person не определен, поскольку он находится в закрытии – Pablo

ответ

1

Вариант, который немного меньше хака является @ оператора (который является таким же, как this). В среде браузера укажет на window, в node.js, он будет указывать на exports.

class @Person 
    constructor: (@firstName, @lastName) -> 
    sayHi:() -> 
    return "Hi, I'm #{@firstName} #{@lastName}" 

window.Person работает только в браузере, то @ будет работать на узле и в браузере. См. https://stackoverflow.com/a/24352630/227299

В качестве альтернативы вы можете запустить coffescript с опцией -b(--bare), и функция обертки не будет создана.

0

изменения немного декларация класса

class window.Person 
    constructor: (@firstName, @lastName) -> 
    sayHi:() -> 
    return "Hi, I'm #{@firstName} #{@lastName}" 
+0

Это правильный способ заставить его работать в «кофе»? – Pablo

Смежные вопросы