JavaScript 中调用 Kotlin 方法实例详解


Posted in Javascript onJune 09, 2017

JavaScript 中调用 Kotlin 方法实例详解

Kotlin 编译器生成正常的 JavaScript 类,可以在 JavaScript 代码中自由地使用的函数和属性 。不过,你应该记住一些微妙的事情。

用独立的 JavaScript 隔离声明

为了防止损坏全局对象,Kotlin 创建一个包含当前模块中所有 Kotlin 声明的对象 。所以如果你把模块命名为 myModule,那么所有的声明都可以通过 myModule 对象在 JavaScript 中可用。例如:

fun foo() = "Hello"

可以在 JavaScript 中这样调用:

alert(myModule.foo());

这不适用于当你将 Kotlin 模块编译为 JavaScript 模块时(关于这点的详细信息请参见 JavaScript 模块)。 在这种情况下,不会有一个包装对象,而是将声明作为相应类型的 JavaScript 模块对外暴露。例如, 对于 CommonJS 的场景,你应该写:

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

包结构

Kotlin 将其包结构暴露给 JavaScript,因此除非你在根包中定义声明, 否则必须在 JavaScript 中使用完整限定的名称。例如:

package my.qualified.packagename

fun foo() = "Hello"

可以在 JavaScript 中这样调用:

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

@JsName 注解

在某些情况下(例如为了支持重载),Kotlin 编译器会修饰(mangle) JavaScript 代码中生成的函数和属性的名称。要控制生成的名称,可以使用 @JsName 注解:

// 模块“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 注解,相应函数的名称会包含从函数签名计算而来的后缀,例如 hello_61zpoe$。

请注意,Kotlin 编译器不会对 external 声明应用这种修饰,因此你不必在其上使用 @JsName。 值得注意的另一个例子是从外部类继承的非外部类。 在这种情况下,任何被覆盖的函数也不会被修饰。

@JsName 的参数需要是一个常量字符串字面值,该字面值是一个有效的标识符。 任何尝试将非标识符字符串传递给 @JsName 时,编译器都会报错。 以下示例会产生编译期错误:

@JsName("new C()")  // 此处出错
external fun newC()

在 JavaScript 中表示 Kotlin 类型

  1. 除了 kotlin.Long 的 Kotlin 数字类型映射到 JavaScript Number。
  2. kotlin.Char 映射到 JavaScript Number 来表示字符代码。
  3. Kotlin 在运行时无法区分数字类型(kotlin.Long 除外),即以下代码能够工作:
fun f() {
  val x: Int = 23
  val y: Any = x
  println(y as Float)
}
  1. Kotlin 保留了 kotlin.Int、 kotlin.Byte、 kotlin.Short、 kotlin.Char 和 kotlin.Long 的溢出语义。
  2. JavaScript 中没有 64 位整数,所以 kotlin.Long 没有映射到任何 JavaScript 对象, 它是由一个 Kotlin 类模拟的。
  3. kotlin.String 映射到 JavaScript String。
  4. kotlin.Any 映射到 JavaScript Object(即 new Object()、 {} 等)。
  5. kotlin.Array 映射到 JavaScript Array。
  6. Kotlin 集合(即 List、 Set、 Map 等)没有映射到任何特定的 JavaScript 类型。
  7. kotlin.Throwable 映射到 JavaScript Error。
  8. Kotlin 在 JavaScript 中保留了惰性对象初始化。
  9. Kotlin 不会在 JavaScript 中实现顶层属性的惰性初始化。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery tools之tabs 选项卡/页签
Jul 25 Javascript
超级酷和最实用的jQuery实例收集(20个)
Apr 21 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
JavaScript数据结构和算法之二叉树详解
Feb 11 Javascript
JavaScript调试的多个必备小Tips
Jan 15 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
JS实现li标签的删除
Apr 12 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 Javascript
JavaScript实现栈结构详细过程
Dec 06 Javascript
javascript进阶篇深拷贝实现的四种方式
Jul 07 Javascript
TypeScript 内置高级类型编程示例
Sep 23 Javascript
angularjs $http实现form表单提交示例
Jun 09 #Javascript
JavaScript设计模式之单例模式详解
Jun 09 #Javascript
Bootstrap Table使用整理(四)之工具栏
Jun 09 #Javascript
JavaScript设计模式之策略模式详解
Jun 09 #Javascript
Bootstrap Table使用整理(三)
Jun 09 #Javascript
Bootstrap Table使用整理(二)
Jun 09 #Javascript
Bootstrap Table使用整理(一)
Jun 09 #Javascript
You might like
一个好用的PHP验证码类实例分享
2013/12/27 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
node.js超时timeout详解
2014/11/26 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
Python中的面向对象编程详解(下)
2015/04/13 Python
总结Python编程中函数的使用要点
2016/03/20 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
Python列表解析配合if else的方法
2018/06/23 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
Python 私有化操作实例分析
2019/11/21 Python
python颜色随机生成器的实例代码
2020/01/10 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Intersport西班牙:在线体育商店
2019/11/06 全球购物
怎样自定义一个异常类
2016/09/27 面试题
节能宣传周活动总结
2014/05/08 职场文书
2014年党支部学习材料
2014/05/19 职场文书
教师党员个人自我评价
2015/03/04 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫