使用ClojureScript从JavaScript对象属性调用构造函数

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

如何正确调用另一个对象中的构造函数属性?

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属性,因为我理解您直接在html head文档中包含了js脚本库。所以,如果这行代码(js* "new Library.Thing()")对您起作用,那么它意味着从cljs-js-compiled可以使用js库。
无论如何,我在js模拟库中留下了一个"alert"来检查文件是否正确加载。

希望它能为您工作
Juan


1
换句话说,如果我先将构造函数绑定到本地变量,就可以调用它。(let [Thing (.-Thing js/Library)] (new Thing))(let [Thing (.-Thing js/Library)] (Thing.)) 都可以正常工作。你关于脚本直接包含在文档中的说法是正确的。 - Josh Headapohl
1
嗨,Josh,你对于本地构造函数绑定的看法是正确的。这个点 js 构造函数 "." 是一个非常奇特的行为。我刚刚意识到你可以使用这个 "." 调用普通函数。(defn -log [message] (.log js/console message) ) (-log. "Hello Josh") - tangrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接