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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
javascript判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
用JS写的一个TableView控件代码
Jan 23 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 Javascript
Bootstrap轮播图的使用和理解4
Dec 14 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
Sep 21 Javascript
Vue中util的工具函数实例详解
Jul 08 Javascript
vue把输入框的内容添加到页面的实例讲解
Nov 11 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
thinkphp中memcache的用法实例
2014/11/29 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
jquery的map与get方法详解
2013/11/04 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
用Python编写web API的教程
2015/04/30 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Python自动化操作实现图例绘制
2020/07/09 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
异步传递消息系统的作用
2016/05/01 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
最热门的自我评价
2013/12/30 职场文书
工程负责人任命书
2014/06/06 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
辩护意见书
2015/06/04 职场文书
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript