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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Kotlin 語(yǔ)言中調(diào)用 JavaScript 方法實(shí)例詳解

Kotlin 語(yǔ)言中調(diào)用 JavaScript 方法實(shí)例詳解

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

這篇文章主要介紹了Kotlin 語(yǔ)言中調(diào)用 JavaScript 方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Kotlin 語(yǔ)言中調(diào)用 JavaScript 方法實(shí)例詳解

Kotlin 已被設(shè)計(jì)為能夠與 Java 平臺(tái)輕松互操作。它將 Java 類視為 Kotlin 類,并且 Java 也將 Kotlin 類視為 Java 類。但是,JavaScript 是一種動(dòng)態(tài)類型語(yǔ)言,這意味著它不會(huì)在編譯期檢查類型。你可以通過動(dòng)態(tài)類型在 Kotlin 中自由地與 JavaScript 交流,但是如果你想要 Kotlin 類型系統(tǒng)的全部威力 ,你可以為 JavaScript 庫(kù)創(chuàng)建 Kotlin 頭文件。

內(nèi)聯(lián) JavaScript

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

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

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

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

external 修飾符

要告訴 Kotlin 某個(gè)聲明是用純 JavaScript 編寫的,你應(yīng)該用 external 修飾符來標(biāo)記它。 當(dāng)編譯器看到這樣的聲明時(shí),它假定相應(yīng)類、函數(shù)或?qū)傩缘膶?shí)現(xiàn)由開發(fā)人員提供,因此不會(huì)嘗試從聲明中生成任何 JavaScript 代碼。 這意味著你應(yīng)該省略 external 聲明內(nèi)容的代碼體。例如:

?
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

 

請(qǐng)注意,嵌套的聲明會(huì)繼承 external 修飾符,即在 Node 類中,我們?cè)诔蓡T函數(shù)和屬性之前并不放置 external。

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

 聲明類的(靜態(tài))成員

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

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

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

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

聲明可選參數(shù)

一個(gè)外部函數(shù)可以有可選參數(shù)。 JavaScript 實(shí)現(xiàn)實(shí)際上如何計(jì)算這些參數(shù)的默認(rèn)值,是 Kotlin 所不知道的, 因此在 Kotlin 中不可能使用通常的語(yǔ)法聲明這些參數(shù)。 你應(yīng)該使用以下語(yǔ)法:

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

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

擴(kuò)展 JavaScript 類

你可以輕松擴(kuò)展 JavaScript 類,因?yàn)樗鼈兪?Kotlin 類。只需定義一個(gè) external 類并用非 external 類擴(kuò)展它。例如:

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

有一些限制:

當(dāng)一個(gè)外部基類的函數(shù)被簽名重載時(shí),不能在派生類中覆蓋它。

不能覆蓋一個(gè)使用默認(rèn)參數(shù)的函數(shù)。

請(qǐng)注意,你無(wú)法用外部類擴(kuò)展非外部類。

external 接口

JavaScript 沒有接口的概念。當(dāng)函數(shù)期望其參數(shù)支持 foo 和 bar 方法時(shí),只需傳遞實(shí)際具有這些方法的對(duì)象。 對(duì)于靜態(tài)類型的 Kotlin,你可以使用接口來表達(dá)這點(diǎn),例如:

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

外部接口的另一個(gè)使用場(chǎng)景是描述設(shè)置對(duì)象。例如:

?
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 檢查的右側(cè)使用。
as 轉(zhuǎn)換為外部接口總是成功(并在編譯時(shí)產(chǎn)生警告)。
它們不能作為具體化類型參數(shù)傳遞。
它們不能用在類的字面值表達(dá)式(即 I::class)中。

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久99 | 亚洲国产欧美另类va在线观看 | 国产精品资源在线观看网站 | 四虎海外影院 | 夫承子液by免费阅读 | 免费观看欧美性一级 | 日韩性生活片 | 日本免费一区二区三区a区 日本免费三片在线观看 | 欧美日韩国产手机在线观看视频 | video one 中国按摩 | 青青草成人影院 | 哇嘎在线精品视频在线观看 | 亚洲精彩视频在线观看 | 亚洲欧美在线免费 | 精品在线播放视频 | 日韩成人精品 | 男女性潮高片无遮挡禁18 | 国产第一福利影院 | 欧美1 | h片免费网站 | 久久久久青草大香线综合精品 | 四虎永久网址在线观看 | 国产第一福利 | 国产一区在线看 | 日本韩国一区二区三区 | 欧美黑人性猛交╳xx╳动态图 | 国产无限制自拍 | 国产精品亚洲片在线不卡 | 精品在线小视频 | 免费港剧在线观看港剧 | 91热这里只有精品 | 国产欧美另类 | 日韩欧美国产综合精品 | 奇米影视亚洲狠狠色 | 国产激情久久久久影院小草 | 日本不卡免免费观看 | 亚洲 欧美 制服 校园 动漫 | 精品丰满人妻无套内射 | 袖珍人与大黑人性视频 | 日本欧美一二三区色视频 | pregnant欧美孕交xxx |