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_10_对象模型
Oct 16 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
bootstrap侧边栏圆点导航
Jan 11 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
JavaScript异步加载问题总结
Feb 17 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 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中extract()函数的定义和用法
2012/08/17 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
简单实现python爬虫功能
2015/12/31 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
大学生创业计划书的范文
2014/01/07 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
公务员转正考察材料
2014/02/07 职场文书
停车场管理制度范本
2015/08/05 职场文书
redis限流的实际应用
2021/04/24 Redis
利用python调用摄像头的实例分析
2021/06/07 Python
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python