Вызов свойства объекта JavaScript как конструктора из ClojureScript

Я использую библиотеку JavaScript, которая предоставляет конструктор как свойство глобального объекта.

В JavaScript я могу вызвать конструктор следующим образом.

var thing = new Library.Thing();

Как мне вызвать конструктор в ClojureScript? Ни одна из этих работ не работает.

; These all cause compiler errors
(new (.-Thing js/Library)) ; First arg to new must be a symbol
(new (.Thing js/Library))
(new .-Thing js/Library)
(new .Thing js/Library)
(new js/Library/Thing)     ; Invalid token: js/Library/Thing

; These all compile to different JS than I am looking for
((.-Thing js/Library).) ; Library.Thing.call(null, _SLASH_);
((.Thing js/Library).)  ; Library.Thing().call(null, _SLASH_);

Он отлично работает, если я использую js *, но это обман, правильно?

(js* "new Library.Thing()")

Каков правильный способ вызова функции-конструктора, которая является свойством другого объекта?

Ответ 1

Если вы посмотрите http://himera.herokuapp.com/synonym.html, вы можете найти конкретный синтаксис для создания объектов в clojurescript.

Я написал эту библиотеку js mock, основанную в этой документации, чтобы сделать тест:

function Person(name) {
this.name = name;
}

Person.prototype.greet = function() {
return "Hello, " + this.name;
};


var f={
"hola":"hola juan",

Person:Person

};

var person=new f.Person("Juan");
alert(person.greet());

Затем из clojurescript вы должны использовать точечный синтаксис (но префикс "js/" ваш глобальный тип js):

(let [Person (.-Person js/f)
        juan (Person. "Juan")
        ]
    (.log js/console  (.greet juan)))

Я не упоминаю в этом ответе: externs свойство вашей компиляции cljsbuild beacuse Я понимаю, что вы включаете библиотеку js script непосредственно в свой html-заголовок. Итак, если эта строка работает для вас (js* "new Library.Thing()"), это будет означать, что библиотека js доступна из cljs-js-compiled.
Во всяком случае, я оставил "предупреждение" в библиотеке js mock, чтобы проверить правильность загрузки файла.

Я надеюсь, что это сработает для вас
Juan