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 URL解析函数和分段URL解析方法
Apr 12 Javascript
javascript中的return和闭包函数浅析
Jun 06 Javascript
jQuery中prev()方法用法实例
Jan 08 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
javascript 中的 delete及delete运算符
Nov 15 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
JS中substring与substr的用法
Nov 16 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
深入了解JavaScript词法作用域
Jul 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在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
Python实现多线程HTTP下载器示例
2017/02/11 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Python常用编译器原理及特点解析
2020/03/23 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
计生工作先进事迹
2014/08/15 职场文书
地理科学专业自荐信
2014/09/01 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年图书室工作总结
2014/12/09 职场文书
感动中国何玥观后感
2015/06/02 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Pandas数据类型之category的用法
2021/06/28 Python