我有一个简单的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库,该JavaScript库将依次尝试调用以下两个方法:
myfoo()
myfoo.bar()
当然,这将不起作用,因为我无法在Foo上定义apply
方法,因为它是从js.Object
派生的,并且不会转换为在对象上调用()
。
如何为这种情况构造一个合适的类?
在JavaScript中,像myfoo()
这样的调用有效的唯一方法是将myfoo
作为函数值created。要使myfoo.bar()
另外起作用,必须在创建函数值后对其进行修补。除了代理(完全是另一只野兽)之外,没有任何一种方法可以首先从一个类或不从一个类创建myfoo
作为对象,并使其回答myfoo()
。
因此,这也是您在Scala.js中必须执行的操作:
val myfoo = ({ () =>
println("apply")
}: js.Function0[Unit]).asInstanceOf[js.Dynamic]
myfoo.bar = ({ () =>
println("bar")
}: js.Function0[Unit])
之后,您可以将myfoo
传递给JavaScript代码。