JavaScript 中調(diào)用 Kotlin 方法實(shí)例詳解
JavaScript 中調(diào)用 Kotlin 方法實(shí)例詳解
Kotlin 編譯器生成正常的 JavaScript 類(lèi),可以在 JavaScript 代碼中自由地使用的函數(shù)和屬性 。不過(guò),你應(yīng)該記住一些微妙的事情。
用獨(dú)立的 JavaScript 隔離聲明
為了防止損壞全局對(duì)象,Kotlin 創(chuàng)建一個(gè)包含當(dāng)前模塊中所有 Kotlin 聲明的對(duì)象 。所以如果你把模塊命名為 myModule,那么所有的聲明都可以通過(guò) myModule 對(duì)象在 JavaScript 中可用。例如:
fun foo() = "Hello"
可以在 JavaScript 中這樣調(diào)用:
alert(myModule.foo());
這不適用于當(dāng)你將 Kotlin 模塊編譯為 JavaScript 模塊時(shí)(關(guān)于這點(diǎn)的詳細(xì)信息請(qǐng)參見(jiàn) JavaScript 模塊)。 在這種情況下,不會(huì)有一個(gè)包裝對(duì)象,而是將聲明作為相應(yīng)類(lèi)型的 JavaScript 模塊對(duì)外暴露。例如, 對(duì)于 CommonJS 的場(chǎng)景,你應(yīng)該寫(xiě):
alert(require('myModule').foo());
包結(jié)構(gòu)
Kotlin 將其包結(jié)構(gòu)暴露給 JavaScript,因此除非你在根包中定義聲明, 否則必須在 JavaScript 中使用完整限定的名稱(chēng)。例如:
package my.qualified.packagename fun foo() = "Hello"
可以在 JavaScript 中這樣調(diào)用:
alert(myModule.my.qualified.packagename.foo());
@JsName 注解
在某些情況下(例如為了支持重載),Kotlin 編譯器會(huì)修飾(mangle) JavaScript 代碼中生成的函數(shù)和屬性的名稱(chēng)。要控制生成的名稱(chēng),可以使用 @JsName 注解:
// 模塊“kjs” class Person(val name: String) { fun hello() { println("Hello $name!") } @JsName("helloWithGreeting") fun hello(greeting: String) { println("$greeting $name!") } }
現(xiàn)在,你可以通過(guò)以下方式在 JavaScript 中使用這個(gè)類(lèi):
var person = new kjs.Person("Dmitry"); // 引用到模塊“kjs” person.hello(); // 輸出“Hello Dmitry!” person.helloWithGreeting("Servus"); // 輸出“Servus Dmitry!”
如果我們沒(méi)有指定 @JsName 注解,相應(yīng)函數(shù)的名稱(chēng)會(huì)包含從函數(shù)簽名計(jì)算而來(lái)的后綴,例如 hello_61zpoe$。
請(qǐng)注意,Kotlin 編譯器不會(huì)對(duì) external 聲明應(yīng)用這種修飾,因此你不必在其上使用 @JsName。 值得注意的另一個(gè)例子是從外部類(lèi)繼承的非外部類(lèi)。 在這種情況下,任何被覆蓋的函數(shù)也不會(huì)被修飾。
@JsName 的參數(shù)需要是一個(gè)常量字符串字面值,該字面值是一個(gè)有效的標(biāo)識(shí)符。 任何嘗試將非標(biāo)識(shí)符字符串傳遞給 @JsName 時(shí),編譯器都會(huì)報(bào)錯(cuò)。 以下示例會(huì)產(chǎn)生編譯期錯(cuò)誤:
@JsName("new C()") // 此處出錯(cuò) external fun newC()
在 JavaScript 中表示 Kotlin 類(lèi)型
- 除了 kotlin.Long 的 Kotlin 數(shù)字類(lèi)型映射到 JavaScript Number。
- kotlin.Char 映射到 JavaScript Number 來(lái)表示字符代碼。
- Kotlin 在運(yùn)行時(shí)無(wú)法區(qū)分?jǐn)?shù)字類(lèi)型(kotlin.Long 除外),即以下代碼能夠工作:
fun f() { val x: Int = 23 val y: Any = x println(y as Float) }
- Kotlin 保留了 kotlin.Int、 kotlin.Byte、 kotlin.Short、 kotlin.Char 和 kotlin.Long 的溢出語(yǔ)義。
- JavaScript 中沒(méi)有 64 位整數(shù),所以 kotlin.Long 沒(méi)有映射到任何 JavaScript 對(duì)象, 它是由一個(gè) Kotlin 類(lèi)模擬的。
- kotlin.String 映射到 JavaScript String。
- kotlin.Any 映射到 JavaScript Object(即 new Object()、 {} 等)。
- kotlin.Array 映射到 JavaScript Array。
- Kotlin 集合(即 List、 Set、 Map 等)沒(méi)有映射到任何特定的 JavaScript 類(lèi)型。
- kotlin.Throwable 映射到 JavaScript Error。
- Kotlin 在 JavaScript 中保留了惰性對(duì)象初始化。
- Kotlin 不會(huì)在 JavaScript 中實(shí)現(xiàn)頂層屬性的惰性初始化。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
js實(shí)現(xiàn)調(diào)用網(wǎng)絡(luò)攝像頭及常見(jiàn)錯(cuò)誤處理
這篇文章主要介紹了js實(shí)現(xiàn)調(diào)用網(wǎng)絡(luò)攝像頭及常見(jiàn)錯(cuò)誤處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03js 簡(jiǎn)易版滾動(dòng)條實(shí)例(適用于移動(dòng)端H5開(kāi)發(fā))
下面小編就為大家?guī)?lái)一篇js 簡(jiǎn)易版滾動(dòng)條實(shí)例(適用于移動(dòng)端H5開(kāi)發(fā))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06JavaScript實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車(chē)最全代碼解析(ES6面向?qū)ο?
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車(chē)最全代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09奉獻(xiàn)給JavaScript初學(xué)者的編寫(xiě)開(kāi)發(fā)的七個(gè)細(xì)節(jié)
每種語(yǔ)言都有它特別的地方,對(duì)于JavaScript來(lái)說(shuō),使用var就可以聲明任意類(lèi)型的變量,這門(mén)腳本語(yǔ)言看起來(lái)很簡(jiǎn)單,然而想要寫(xiě)出優(yōu)雅的代碼卻是需要不斷積累經(jīng)驗(yàn)的。本文利列舉了JavaScript初學(xué)者應(yīng)該注意的七個(gè)細(xì)節(jié),與大家分享。2011-01-01JS獲取整個(gè)頁(yè)面文檔的實(shí)現(xiàn)代碼
就是在當(dāng)前頁(yè)面用AJAX請(qǐng)求當(dāng)前頁(yè)面,返回的就是整個(gè)頁(yè)面的HTML··既然是整個(gè)頁(yè)面,所以也包括文檔聲明2011-12-12利用JS解決ie6不支持max-width,max-height問(wèn)題的方法
本篇文章主要介紹了利用JS解決ie6不支持max-width,max-height問(wèn)題的方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01JavaScript實(shí)現(xiàn)輕松創(chuàng)建二維數(shù)組的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了JavaScript中實(shí)現(xiàn)輕松創(chuàng)建二維數(shù)組的多種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法
Knockoutjs 的Components 是一種自定義的組件,它以一種強(qiáng)大、簡(jiǎn)介的方式將你自己的ui代碼組織成一種單獨(dú)的、可重用的模塊。接下來(lái)通過(guò)本文給大家介紹knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法,一起看看吧2016-09-09