一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Kotlin 語言中調用 JavaScript 方法實例詳解

Kotlin 語言中調用 JavaScript 方法實例詳解

2020-11-12 17:30coyee Java教程

這篇文章主要介紹了Kotlin 語言中調用 JavaScript 方法實例詳解的相關資料,需要的朋友可以參考下

Kotlin 語言中調用 JavaScript 方法實例詳解

Kotlin 已被設計為能夠與 Java 平臺輕松互操作。它將 Java 類視為 Kotlin 類,并且 Java 也將 Kotlin 類視為 Java 類。但是,JavaScript 是一種動態類型語言,這意味著它不會在編譯期檢查類型。你可以通過動態類型在 Kotlin 中自由地與 JavaScript 交流,但是如果你想要 Kotlin 類型系統的全部威力 ,你可以為 JavaScript 庫創建 Kotlin 頭文件。

內聯 JavaScript

你可以使用 js("……") 函數將一些 JavaScript 代碼嵌入到 Kotlin 代碼中。 例如:

?
1
2
3
fun jsTypeOf(o: Any): String {
 return js("typeof o")
}

js 的參數必須是字符串常量。因此,以下代碼是不正確的:

?
1
2
3
4
fun jsTypeOf(o: Any): String {
 return js(getTypeof() + " o") // 此處報錯
}
fun getTypeof() = "typeof"

external 修飾符

要告訴 Kotlin 某個聲明是用純 JavaScript 編寫的,你應該用 external 修飾符來標記它。 當編譯器看到這樣的聲明時,它假定相應類、函數或屬性的實現由開發人員提供,因此不會嘗試從聲明中生成任何 JavaScript 代碼。 這意味著你應該省略 external 聲明內容的代碼體。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
external fun alert(message: Any?): Unit
 
external class Node {
 val firstChild: Node
 
 fun append(child: Node): Node
 
 fun removeChild(child: Node): Node
 
 // 等等
}
external val window: Window

 

請注意,嵌套的聲明會繼承 external 修飾符,即在 Node 類中,我們在成員函數和屬性之前并不放置 external。

external 修飾符只允許在包級聲明中使用。 你不能聲明一個非 external 類的 external 成員。

 聲明類的(靜態)成員

在 JavaScript 中,你可以在原型或者類本身上定義成員。即:

?
1
2
3
4
function MyClass() {
}
MyClass.sharedMember = function() { /* 實現 */ };
MyClass.prototype.ownMember = function() { /* 實現 */ };

Kotlin 中沒有這樣的語法。然而,在 Kotlin 中我們有伴生(companion)對象。Kotlin 以特殊的方式處理external 類的伴生對象:替代期待一個對象的是,它假定伴生對象的成員就是該類自身的成員。要描述來自上例中的 MyClass,你可以這樣寫:

?
1
2
3
4
5
6
7
external class MyClass {
 companion object {
  fun sharedMember()
 }
 
 fun ownMember()
}

聲明可選參數

一個外部函數可以有可選參數。 JavaScript 實現實際上如何計算這些參數的默認值,是 Kotlin 所不知道的, 因此在 Kotlin 中不可能使用通常的語法聲明這些參數。 你應該使用以下語法:

?
1
2
3
external fun myFunWithOptionalArgs(x: Int,
 y: String = definedExternally,
 z: Long = definedExternally)

這意味著你可以使用一個必需參數和兩個可選參數來調用 myFunWithOptionalArgs(它們的默認值由一些 JavaScript 代碼算出)。

擴展 JavaScript 類

你可以輕松擴展 JavaScript 類,因為它們是 Kotlin 類。只需定義一個 external 類并用非 external 類擴展它。例如:

?
1
2
3
4
5
6
7
8
9
external open class HTMLElement : Element() {
 /* 成員 */
}
 
class CustomElement : HTMLElement() {
 fun foo() {
  alert("bar")
 }
}

有一些限制:

當一個外部基類的函數被簽名重載時,不能在派生類中覆蓋它。

不能覆蓋一個使用默認參數的函數。

請注意,你無法用外部類擴展非外部類。

external 接口

JavaScript 沒有接口的概念。當函數期望其參數支持 foo 和 bar 方法時,只需傳遞實際具有這些方法的對象。 對于靜態類型的 Kotlin,你可以使用接口來表達這點,例如:

?
1
2
3
4
5
6
7
external interface HasFooAndBar {
 fun foo()
 
 fun bar()
}
 
external fun myFunction(p: HasFooAndBar)

外部接口的另一個使用場景是描述設置對象。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
external interface JQueryAjaxSettings {
 var async: Boolean
 
 var cache: Boolean
 
 var complete: (JQueryXHR, String) -> Unit
 
 // 等等
}
 
fun JQueryAjaxSettings(): JQueryAjaxSettings = js("{}")
 
external class JQuery {
 companion object {
  fun get(settings: JQueryAjaxSettings): JQueryXHR
 }
}
 
fun sendQuery() {
 JQuery.get(JQueryAjaxSettings().apply {
  complete = { (xhr, data) ->
   window.alert("Request complete")
  }
 })
}

外部接口有一些限制:

它們不能在 is 檢查的右側使用。
as 轉換為外部接口總是成功(并在編譯時產生警告)。
它們不能作為具體化類型參數傳遞。
它們不能用在類的字面值表達式(即 I::class)中。

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

原文鏈接:https://coyee.com/article/12318-calling-javascript-from-kotlin

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人午夜影院在线观看 | 国内精品麻豆 | 丁香婷婷在线视频 | 98成人网| 关晓彤被调教出奶水 | 久久成人a毛片免费观看网站 | 变形金刚第一部 | 精品国产欧美精品v | 逼逼日| 加勒比京东热 | 好吊色视频988gao在线观看 | 18岁的老处女 | 紧身裙女教师miad711在线 | 国产99精品 | 92国产福利久久青青草原 | 国产v日韩v欧美v精品专区 | 日韩 欧美 国产 亚洲 中文 | 草莓视频网站18勿进 | 被黑人同学彻底征服全文小说阅读 | 欧美乱子伦xxxx12在线 | 性印度freehd | 国产麻豆视频 | 亚洲日韩精品欧美一区二区一 | 日本高清中文字幕一区二区三区 | 国产福利不卡视频在免费 | 精品女同一区二区三区免费站 | 日本不卡在线一区二区三区视频 | 亚洲国产第一区二区香蕉日日 | 女学生被老师调教在教室 | a毛片免费全部在线播放毛 a级在线看 | 天天做天天爰夜夜爽 | 国产欧美日韩一区二区三区在线 | 欧美日韩国产亚洲一区二区三区 | 亚洲精品综合 | 国产精品aⅴ | 午夜精品亚洲 | 国产剧情在线播放 | 久久精品热在线观看85 | 精品视频99 | 高清在线免费观看 | 精品视频日本 |