13

我正在使用一个将构造函数公开为全局对象属性的 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()")

调用作为另一个对象属性的构造函数的正确方法是什么?

4

1 回答 1

11

如果您查看http://himera.herokuapp.com/synonym.html,您可以找到在 clojurescript 中实例化对象的特定语法。

我根据本文档编写了这个 js 模拟库来进行测试:

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)))

我在这个答案中没有提到 cljsbuild 编译的 :externs 属性,因为我知道您将 js 脚本库直接包含在您的 html 头文档中。所以,如果这条线对你(js* "new Library.Thing()")有用,那就意味着 js 库可以从 cljs-js-compiled 中获得。
无论如何,我在 js 模拟库中留下了一个“警报”,以检查文件是否正确加载

我希望它对你有用,
胡安

于 2013-10-23T08:02:05.573 回答