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之对系统的toFixed()方法的修正
May 08 Javascript
JQuery学习笔记 nt-child的使用
Jan 17 Javascript
javascript实现上传图片并预览的效果实现代码
Apr 11 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
使用jQuery操作DOM的方法小结
Feb 27 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 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 魔术方法使用说明
2009/10/20 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python读写二进制文件的方法
2015/05/09 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
tensorflow 环境变量设置方式
2020/02/06 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
后备干部考察材料
2014/02/12 职场文书
家长写给孩子的评语
2014/04/18 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
教师师德表现自我评价
2015/03/05 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
JS class语法糖的深入剖析
2022/07/07 Javascript