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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
dedecms页面如何获取会员状态的实例代码
Mar 15 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
Mar 06 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
Apr 25 Javascript
vue实现移动端悬浮窗效果
Dec 01 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
微信小程序 this.triggerEvent()的具体使用
Dec 10 Javascript
这样回答继承可能面试官更满意
Dec 10 Javascript
vue中改变滚动条样式的方法
Mar 03 Javascript
vue3不同环境下实现配置代理
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+iframe图片上传实现即时刷新效果
2016/11/18 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
Python打包可执行文件的方法详解
2016/09/19 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
Keras 使用 Lambda层详解
2020/06/10 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
用python批量下载apk
2020/12/29 Python
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
大学学雷锋活动总结
2014/06/26 职场文书
食品安全汇报材料
2014/08/18 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
学雷锋活动简报
2015/07/20 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
如何自己动手写SQL执行引擎
2021/06/02 MySQL
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL