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 相关文章推荐
javascript Array.sort() 跨浏览器下需要考虑的问题
Dec 07 Javascript
图像替换新技术 状态域方法
Jan 28 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
Nov 21 Javascript
利用Javascript裁剪图片并存储的简单实现
Mar 13 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
JavaScript函数柯里化
Nov 07 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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 ftp文件上传函数(基础版)
2010/06/03 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python实现DES加密解密方法实例详解
2015/06/30 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python爬虫基本知识
2018/03/05 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
九年级历史教学反思
2016/02/19 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书