我正在将一个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关键字一起使用?
谢谢!
答案 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()