[英]Calling JavaScript object property as a constructor from 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()")
調用作為另一個對象屬性的構造函數的正確方法是什么?
如果你查看http://himera.herokuapp.com/synonym.html,你可以找到在clojurescript中實例化objets的特定語法。
我在本文檔中編寫了這個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)))
我在這個答案中沒有提到:你的cljsbuild編譯的externs屬性,因為我知道你直接在你的html頭文檔中包含你的js腳本庫。 所以,如果這條線適合你(js* "new Library.Thing()")
那就意味着js庫可以從cljs-js編譯中獲得。
無論如何,我在js模擬庫中留下了一個“alert”來檢查文件是否正確加載
我希望這個對你有用
胡安
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.