鍍金池/ 教程/ Android/ JavaScript中調(diào)用Kotlin
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ǔ)語法
使用Kotlin進(jìn)行服務(wù)器端開發(fā)
Kotlin接口
Kotlin反射
Kotlin類型別名
Kotlin枚舉類
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類型安全的構(gòu)建器
Kotlin相比Java語言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語法
Kotlin與OSGi
Kotlin數(shù)據(jù)類型
Kotlin是面向?qū)ο筮€是函數(shù)式語言?
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語言比較
Kotlin 與 Java 語言兼容嗎?
Kotlin教程
Kotlin類和繼承
Kotlin對象表達(dá)式和對象聲明
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

JavaScript中調(diào)用Kotlin

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

用獨(dú)立的 JavaScript 隔離聲明

為了防止損壞全局對象,Kotlin 創(chuàng)建一個(gè)包含當(dāng)前模塊中所有 Kotlin 聲明的對象
。所以如果你把模塊命名為 myModule,那么所有的聲明都可以
通過 myModule 對象在 JavaScript 中可用。例如:

fun foo() = "Hello"

可以在 JavaScript 中這樣調(diào)用:

alert(myModule.foo());

這不適用于當(dāng)你將 Kotlin 模塊編譯為 JavaScript 模塊時(shí)(關(guān)于這點(diǎn)的詳細(xì)信息請參見 JavaScript 模塊)。
在這種情況下,不會(huì)有一個(gè)包裝對象,而是將聲明作為相應(yīng)類型的 JavaScript 模塊對外暴露。例如,
對于 CommonJS 的場景,你應(yīng)該寫:

alert(require('myModule').foo());

包結(jié)構(gòu)

Kotlin 將其包結(jié)構(gòu)暴露給 JavaScript,因此除非你在根包中定義聲明,
否則必須在 JavaScript 中使用完整限定的名稱。例如:

package my.qualified.packagename

fun foo() = "Hello"

可以在 JavaScript 中這樣調(diào)用:

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

@JsName 注解

在某些情況下(例如為了支持重載),Kotlin 編譯器會(huì)修飾(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 中使用這個(gè)類:

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

如果我們沒有指定 @JsName 注解,相應(yīng)函數(shù)的名稱會(huì)包含
從函數(shù)簽名計(jì)算而來的后綴,例如 hello_61zpoe$

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

@JsName 的參數(shù)需要是一個(gè)常量字符串字面值,該字面值是一個(gè)有效的標(biāo)識(shí)符。
任何嘗試將非標(biāo)識(shí)符字符串傳遞給 @JsName 時(shí),編譯器都會(huì)報(bào)錯(cuò)。
以下示例會(huì)產(chǎn)生編譯期錯(cuò)誤:

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

在 JavaScript 中表示 Kotlin 類型

  • 除了 kotlin.Long 的 Kotlin 數(shù)字類型映射到 JavaScript Number。
  • kotlin.Char 映射到 JavaScript Number 來表示字符代碼。
  • Kotlin 在運(yùn)行時(shí)無法區(qū)分?jǐn)?shù)字類型(kotlin.Long 除外),即以下代碼能夠工作:

    fun f() {
        val x: Int = 23
        val y: Any = x
        println(y as Float)
    }
    
  • Kotlin 保留了 kotlin.Int、 kotlin.Byte、 kotlin.Shortkotlin.Charkotlin.Long 的溢出語義。

  • JavaScript 中沒有 64 位整數(shù),所以 kotlin.Long 沒有映射到任何 JavaScript 對象,
    它是由一個(gè) 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 不會(huì)在 JavaScript 中實(shí)現(xiàn)頂層屬性的惰性初始化。

上一篇:Kotlin集合下一篇:Kotlin操作符符重載