【发布时间】:2020-01-22 23:51:49
【问题描述】:
我有一个简单的 Scala.js 类(Scala-2.12.10 和 Scala-js 0.6.31):
class Foo extends js.Object {
def apply() = { println("apply") }
def bar() = { println("bar") }
}
val myfoo = new Foo()
Foo 的一个实例将被传递给一个 JavaScript 库,该库将依次尝试调用以下两个方法:
myfoo()
myfoo.bar()
当然,这不起作用,因为我无法在 Foo 上定义 apply 方法,因为它派生自 js.Object 并且不会转化为在对象上调用 ()。
如何为这个场景构建一个合适的类?
更新:
这里是一些基于@sjrd 回答的示例代码,它在封装js.Dynamic 复杂性的同时提供强类型。
trait FooTrait extends js.Object {
def own()
def bar()
}
class Foo extends FooTrait {
def own() = { println("apply") }
def bar() = { println("bar") }
}
def makeFoo(foo: FooTrait]) = {
val jsFoo = ({ () =>
foo.own()
}: js.Function0[Unit]).asInstanceOf[js.Dynamic]
jsFoo.bar = ({ () =>
foo.bar()
}: js.Function0[Unit])
jsFoo
}
val myFoo = makeFoo(new Foo())
现在 myFoo 已准备好传递给 JavaScript 库。
【问题讨论】:
标签: scala.js