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

