如何从 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)
}
我正在将 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)
}