簡體   English   中英

從ClojureScript調用JavaScript對象屬性作為構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM