在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Kotlin調(diào)用JavaScript
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語(yǔ)法
使用Kotlin進(jìn)行服務(wù)器端開發(fā)
Kotlin接口
Kotlin反射
Kotlin類型別名
Kotlin枚舉類
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類型安全的構(gòu)建器
Kotlin相比Java語(yǔ)言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語(yǔ)法
Kotlin與OSGi
Kotlin數(shù)據(jù)類型
Kotlin是面向?qū)ο筮€是函數(shù)式語(yǔ)言?
Kotlin動(dòng)態(tài)類型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類
Kotlin控制流程
Kotlin和Java語(yǔ)言比較
Kotlin 與 Java 語(yǔ)言兼容嗎?
Kotlin教程
Kotlin類和繼承
Kotlin對(duì)象表達(dá)式和對(duì)象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin調(diào)用JavaScript

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 代碼中。
例如:

fun jsTypeOf(o: Any): String {
    return js("typeof o")
}

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

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ù)或
屬性的實(shí)現(xiàn)由開發(fā)人員提供,因此不會(huì)嘗試從聲明中生成任何 JavaScript 代碼。
這意味著你應(yīng)該省略 external 聲明內(nèi)容的代碼體。例如:

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è)?br>成員函數(shù)和屬性之前并不放置 external

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

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

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

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,你可以這樣寫:

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ǔ)法:

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ò)展它。例如:

external open class HTMLElement : Element() {
    /* 成員 */
}

class CustomElement : HTMLElement() {
    fun foo() {
        alert("bar")
    }
}

有一些限制:

  1. 當(dāng)一個(gè)外部基類的函數(shù)被簽名重載時(shí),不能在派生類中覆蓋它。
  2. 不能覆蓋一個(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),例如:

external interface HasFooAndBar {
    fun foo()

    fun bar()
}

external fun myFunction(p: HasFooAndBar)

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

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")
        }
    })
}

外部接口有一些限制:

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