如何从scala.js访问新的javascript关键字?

时间:2015-04-25 11:08:01

标签: javascript scala scala.js

我正在将一个JavaScript库移植到Scalajs。 JS对象是在JavaScript端使用new关键字创建的,所以这就是我在大多数情况下所做的。

trait Point extends js.Object {
  def normalize(length: Double): Point = js.native
}

这似乎适用于方法,但是,这对构造函数不起作用。

@JSName("paper.Point")
object PointNative extends js.Object {
  def apply(props: RectProps): Rectangle = js.native
}

上述代码不起作用。它传递类型检查和编译,但在运行时它返回undefined。

如果我像这样修改了PointNative,那么一切都很好。

import js.Dynamic.{ global => g, newInstance => jsnew }
object PointNative {
  def apply(props: RectProps): Rectangle = jsnew(g.paper.Point)(props).asInstanceOf[Point]
}

有没有办法将@JSName和js.native与new关键字一起使用?

谢谢!

1 个答案:

答案 0 :(得分:6)

由于在JavaScript API中paper.Point需要使用new关键字进行实例化,因此您需要将PointNative定义为类:

@JSName("paper.Point")
class PointNative(props: PointProps) extends js.Object {
  ...
}

允许使用

实例化它
new PointNative(props)

就像你在JavaScript中所做的一样。

如果您还希望能够仅使用

进行实例化
PointNative(props)

然后您需要使用js.Object方法定义其他非apply()随播广告:

object PointNative {
  def apply(props: PointProps): PointNative = new PointNative(props)
}

请注意,如果您需要随附PointNative成为js.Object(因为您还想在其中定义paper.Point的静态方法),那么您可以使用{{1}而使用隐式类来代替它:

apply()