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 相关文章推荐
js innerHTML 的一些问题的解决方法
Jun 22 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
你必须知道的Javascript知识点之"this指针"的应用
Apr 23 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
vue服务端渲染的实例代码
Aug 28 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
Feb 15 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 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 ajax 分页类代码
2008/11/13 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
JavaScript中继承用法实例分析
2015/05/16 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Python selenium自动化测试模型图解
2020/04/15 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
.NET面试问题集
2015/12/08 面试题
大学生求职简历的自我评价
2013/10/21 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
电气工程师岗位职责
2014/01/01 职场文书
清洁工表扬信
2014/01/08 职场文书
环境建设实施方案
2014/03/14 职场文书
环保倡议书50字
2014/05/15 职场文书
统计专业自荐书
2014/07/06 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
期中考试后的感想
2015/08/07 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Python 实现Mac 屏幕截图详解
2021/10/05 Python