将Scala.js类实例传递给JavaScript,它将调用函数调用方法

问题描述 投票:1回答:1

我有一个简单的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派生的,并且不会转换为在对象上调用()

如何为这种情况构造一个合适的类?

scala.js
1个回答
0
投票

在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代码。

© www.soinside.com 2019 - 2024. All rights reserved.