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

How can I access the new javascript keyword from 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
}

以上代码无效。它通过了类型检查和编译,但在运行时它 returns 未定义。

如果我像这样修改 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 与新关键字一起使用?

谢谢!

由于在JavaScriptAPI中,paper.Point需要用new关键字实例化,所以需要将PointNative定义为class :

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

允许用

实例化它
new PointNative(props)

就像您在 JavaScript 中所做的那样。

如果您还希望能够实例化它

PointNative(props)

那么您需要使用 apply() 方法定义一个额外的、非 js.Object 的随播广告:

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

注意,如果你需要companion PointNative是一个js.Object(因为你还想在其中定义paper.Point的静态方法),那么你可以拉皮条apply() 用隐含的 class 代替:

implicit class PointNativeCompanionOps(val self: PointNative.type) extends AnyVal {
  def apply(props: PointProps): PointNative = new PointNative(props)
}