国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

JavaScript 中調用 Kotlin 方法實例詳解

2024-05-06 16:37:42
字體:
來源:轉載
供稿:網友

JavaScript 中調用 Kotlin 方法實例詳解

Kotlin 編譯器生成正常的 JavaScript 類,可以在 JavaScript 代碼中自由地使用的函數和屬性 。不過,你應該記住一些微妙的事情。

用獨立的 JavaScript 隔離聲明

為了防止損壞全局對象,Kotlin 創建一個包含當前模塊中所有 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.packagenamefun foo() = "Hello"

可以在 JavaScript 中這樣調用:

alert(myModule.my.qualified.packagename.foo());

@JsName 注解

在某些情況下(例如為了支持重載),Kotlin 編譯器會修飾(mangle) JavaScript 代碼中生成的函數和屬性的名稱。要控制生成的名稱,可以使用 @JsName 注解:

// 模塊“kjs”class Person(val name: String) {  fun hello() {    println("Hello $name!")  }  @JsName("helloWithGreeting")  fun hello(greeting: String) {    println("$greeting $name!")  }}

 現在,你可以通過以下方式在 JavaScript 中使用這個類:

var person = new kjs.Person("Dmitry");  // 引用到模塊“kjs”person.hello();             // 輸出“Hello Dmitry!”person.helloWithGreeting("Servus");   // 輸出“Servus Dmitry!”

如果我們沒有指定 @JsName 注解,相應函數的名稱會包含從函數簽名計算而來的后綴,例如 hello_61zpoe$。

請注意,Kotlin 編譯器不會對 external 聲明應用這種修飾,因此你不必在其上使用 @JsName。 值得注意的另一個例子是從外部類繼承的非外部類。 在這種情況下,任何被覆蓋的函數也不會被修飾。

@JsName 的參數需要是一個常量字符串字面值,該字面值是一個有效的標識符。 任何嘗試將非標識符字符串傳遞給 @JsName 時,編譯器都會報錯。 以下示例會產生編譯期錯誤:

@JsName("new C()")  // 此處出錯external fun newC()

在 JavaScript 中表示 Kotlin 類型

  1. 除了 kotlin.Long 的 Kotlin 數字類型映射到 JavaScript Number。
  2. kotlin.Char 映射到 JavaScript Number 來表示字符代碼。
  3. Kotlin 在運行時無法區分數字類型(kotlin.Long 除外),即以下代碼能夠工作:
fun f() {  val x: Int = 23  val y: Any = x  println(y as Float)}
  1. Kotlin 保留了 kotlin.Int、 kotlin.Byte、 kotlin.Short、 kotlin.Char 和 kotlin.Long 的溢出語義。
  2. JavaScript 中沒有 64 位整數,所以 kotlin.Long 沒有映射到任何 JavaScript 對象, 它是由一個 Kotlin 類模擬的。
  3. kotlin.String 映射到 JavaScript String。
  4. kotlin.Any 映射到 JavaScript Object(即 new Object()、 {} 等)。
  5. kotlin.Array 映射到 JavaScript Array。
  6. Kotlin 集合(即 List、 Set、 Map 等)沒有映射到任何特定的 JavaScript 類型。
  7. kotlin.Throwable 映射到 JavaScript Error。
  8. Kotlin 在 JavaScript 中保留了惰性對象初始化。
  9. Kotlin 不會在 JavaScript 中實現頂層屬性的惰性初始化。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德安县| 满洲里市| 通山县| 蒙自县| 钟山县| 望谟县| 沐川县| 汕头市| 保山市| 西乡县| 五峰| 布拖县| 许昌县| 鲜城| 大荔县| 许昌市| 琼结县| 徐州市| 谢通门县| 诸暨市| 紫金县| 山阴县| 高唐县| 隆昌县| 苗栗县| 琼中| 弥渡县| 沙雅县| 南皮县| 左权县| 枝江市| 读书| 九龙城区| 青海省| 临猗县| 雅江县| 定西市| 内黄县| 南乐县| 长乐市| 灯塔市|