Как мне использовать CoffeeScript, чтобы макетировать существующий код? - PullRequest
3 голосов
/ 17 октября 2011

Я хотел бы сделать макет MarkdownDeep, у меня есть следующий код в JavaScript

MarkdownDeep = new (function () {
    this.Markdown = function () {
        this.Transform = function (a) {
            return "html";
        };
    };
})();

но у меня возникают проблемы с реализацией этого в CoffeeScript

Я попробовал следующее

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
)()
window.MarkdownDeep = MarkdownDeep

но это не работает, в частности, в моем модульном тесте markdown = new MarkdownDeep.Markdown() выдает "undefined - это не функция", хотя версия JS отлично работает.

Ответы [ 5 ]

3 голосов
/ 17 октября 2011

Ваш пример приводит к следующему коду JavaScript:

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});
window.MarkdownDeep = MarkdownDeep;

Строка return this.Markdown = function() { /* ... */ } делает функцию объектом, возвращаемым оператором new.

Запись

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    return
  return
)
window.MarkdownDeep = MarkdownDeep

исправляет проблему.

Дополнительно: Этот ответ упоминает алгоритм построения объекта в javascript

2 голосов
/ 17 октября 2011

Неявные возвраты CoffeeScript могут привести к хаосу при использовании вместе с new.Как уже отмечали другие, вы можете использовать явные возвраты.Другой вариант - использовать class, который создает функцию (constructor) без неявного возврата:

MarkdownDeep = new class
  constructor: ->
    @Markdown = class
      constructor: ->
        @Transform = (a) ->
          'html'

Конечно, это не очень читабельно в этом случае, но, как правило,Вы избавите себя от головной боли, используя class всякий раз, когда используете new.

0 голосов
/ 17 октября 2011

Это то, что Coffeescript выдает в качестве вывода

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});

Последняя строка в каждой функции неявно возвращается в Coffeescript. Проверка этого в консоли выдает MarkdownDeep как

function () {
    return this.Transform = function(a) {
        return "html";
    };
}

, которая возвращает функцию, у которой нет Markdown () в качестве метода.

0 голосов
/ 17 октября 2011

Вам необходимо явно установить возвращаемое значение для ваших объектов / классов, иначе оно будет возвращать функции-члены при создании нового экземпляра.

JS FIDDLE

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    undefined #return undefined instead of this.Transform
  undefined #return undefined instead of this.Markdown
)

markdown = new MarkdownDeep.Markdown()
alert markdown.Transform()

компилируется в:

var MarkdownDeep, markdown;
MarkdownDeep = new (function() {
  this.Markdown = function() {
    this.Transform = function(a) {
      return "html";
    };
    return;
  };
  return;
});
markdown = new MarkdownDeep.Markdown();
alert(markdown.Transform());
0 голосов
/ 17 октября 2011

CoffeeScript автоматически упаковывает каждый выходной файл в анонимную функцию ((function() { ... })()). Чтобы отключить это, используйте параметр --bare или -b при запуске coffee.

...