加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何从Scala.js调用Javascript apply()?

发布时间:2020-12-16 18:16:34 所属栏目:安全 来源:网络整理
导读:如何从 Scala.js代码调用在 Javascript对象上定义的名为apply()的函数? 显而易见的解决方案不起作用,因为apply总是通过Scala.JS(?)编译到其父对象的函数调用中: var test = { apply: function(idx) {...},apple: function(idx) {...}} trait Test extends
如何从 Scala.js代码调用在 Javascript对象上定义的名为apply()的函数?

显而易见的解决方案不起作用,因为apply总是通过Scala.JS(?)编译到其父对象的函数调用中:

var test = {
  apply: function(idx) {...},apple: function(idx) {...}
}
trait Test extends js.Object {
  def apple(idx: Int) : Int = ???
  def apply(idx: Int) : Int = ???
}

val test = js.Dynamic.global.test.asInstanceOf[Test]

test.apple(1) // works,of course

test.apply(1) // does not work (seems to be compiled into the call test(1) ?)

js.Dynamic.global.test.apply(1) // does not work either

解决方法

您可以使用@JSName(“apply”)在Facade类型中注释apply方法.这将产生所需的行为:

trait Test extends js.Object {
  def apple(idx: Int) : Int = ???
  @JSName("apply")
  def apply(idx: Int) : Int = ???
}

测试:

val test = js.Dynamic.literal(
    apply = (idx: Int) => idx,apple = (idx: Int) => idx
).asInstanceOf[Test]

test.apple(1) // -> 1
test.apply(1) // -> 1

对于动态类型的情况,您必须手动调用applyDynamicNamed:

val dyn = test.asInstanceOf[js.Dynamic]

dyn.applyDynamicNamed("apply")(1) // -> 1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读