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 类型
fun f() { val x: int = 23 val y: any = x println(y as float) }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
如对本文有疑问, 点击进行留言回复!!
MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例
CTF 刷题记录(一) 白云新闻搜索(手动与自动化SQL注入)
javascript如何使用函数random来实现课堂随机点名方法详解
网友评论