Kotlin-48.JavaScript調(diào)用Kotlin(Call Kotlin from JavaScript)

官方文檔: http://kotlinlang.org/docs/reference/js-to-kotlin-interop.html

在JS平臺上, kotlin代碼會被Kotlin編譯器轉(zhuǎn)換成JavaScript類/函數(shù)/屬性;
因此在JavaScript代碼中可以自由地調(diào)用kotlin代碼, 然而還有一些細節(jié)需要注意!

1.獨立JavaScript對象隔離聲明(Isolating declarations in a separate JavaScript object)

為了防止損壞全局對象,Kotlin創(chuàng)建一個模塊(module)對象,它包含當前模塊中所有Kotlin聲明;
如果kotlin模塊名是myModule,那么在JavaScript中可通過myModule對象使用kotlin聲明:
    // kotlin模塊名是myModule
    fun foo() = "Hello"

    // 在JavaScript中調(diào)用, myModule是kotlin模塊
    alert(myModule.foo());

當Kotlin模塊(module)編譯為JavaScript模塊(module)時,不適用于上述情況!
在此情況下,Kotlin不會創(chuàng)建的模塊對象,而是將kotlin聲明作為相應(yīng)類型的JavaScript模塊,對外暴露:
    // myModule是kotlin模塊,被編譯為JavaScript模塊
    alert(require('myModule').foo());

2.包結(jié)構(gòu)(Package structure)

Kotlin將其包結(jié)構(gòu)暴露給JavaScript,
因此除非在根包中定義聲明, 否則必須在JavaScript中使用完整限定名,例如:
    // kotlin
    package my.qualified.packagename
    fun foo() = "Hello"

    // 在JavaScript中調(diào)用
    alert(myModule.my.qualified.packagename.foo());

3.@JsName注解(@JsName annotation)

在某些情況下(如為了支持重載),Kotlin編譯器會修改生成的JavaScript的函數(shù)名/屬性名,
使用@JsName注解,控制生成JavaScript的函數(shù)名/屬性名,:
    // kotlin模塊"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注解,相應(yīng)函數(shù)名會添加從函數(shù)簽名計算而來的后綴,例如hello_61zpoe$

注意: 1.Kotlin編譯器不會對external聲明使用@JsName注解修飾
      2.繼承自external類的非external類,被覆蓋的函數(shù)也不會被@JsName修飾!

@JsName參數(shù)是一個字符串字面值常量(有效標識符),如果將非標識符字符串傳遞給@JsName,編譯器會報錯:
    @JsName("new C()")  // 報錯, new C()不是字符串字面值常量
    external fun newC()

4.在JavaScript中表示Kotlin類型(Representing Kotlin types in JavaScript)

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

簡書:http://www.reibang.com/p/a377d6284f1c
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75808450
GitHub博客: http://lioil.win/2017/07/22/Kotlin-kotlinInJS.html
Coding博客: http://c.lioil.win/2017/07/22/Kotlin-kotlinInJS.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子再沧,更是在濱河造成了極大的恐慌,老刑警劉巖是整,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡油额,警方通過查閱死者的電腦和手機催植,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門肮蛹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人创南,你說我怎么就攤上這事伦忠。” “怎么了稿辙?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵昆码,是天一觀的道長。 經(jīng)常有香客問我邻储,道長赋咽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任吨娜,我火速辦了婚禮冬耿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萌壳。我一直安慰自己亦镶,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布袱瓮。 她就那樣靜靜地躺著缤骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尺借。 梳的紋絲不亂的頭發(fā)上绊起,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音燎斩,去河邊找鬼虱歪。 笑死,一個胖子當著我的面吹牛栅表,可吹牛的內(nèi)容都是我干的笋鄙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怪瓶,長吁一口氣:“原來是場噩夢啊……” “哼萧落!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤找岖,失蹤者是張志新(化名)和其女友劉穎陨倡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许布,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡兴革,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜唾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帖旨。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灵妨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情落竹,我是刑警寧澤泌霍,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站述召,受9級特大地震影響朱转,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜积暖,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一藤为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夺刑,春花似錦缅疟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沼填,卻和暖如春桅咆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坞笙。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工岩饼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛夜。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓籍茧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梯澜。 傳聞我的和親對象是個殘疾皇子硕糊,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容