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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
再谈JavaScript线程
Jul 10 Javascript
JavaScript基础心法 数据类型
Mar 05 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
koa中间件核心(koa-compose)源码解读分析
Jun 15 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
Aug 08 Javascript
vue如何清除浏览器历史栈
May 25 Vue.js
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数组应该有多大的分析
2009/07/30 PHP
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
Python探索之ModelForm代码详解
2017/10/26 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
简单了解django缓存方式及配置
2019/07/19 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
美国创意之家:BulbHead
2017/07/12 全球购物
cf收人广告词大全
2014/03/14 职场文书
广播体操口号
2014/06/18 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
市场营销计划书
2019/04/24 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
python百行代码实现汉服圈图片爬取
2021/11/23 Python