ScalaJs 和 Javascript 的 "implements" 特征是否有一些替代方案
Is it some alternatives to "implements" traits with ScalaJs and Javascript
我有这段代码,我希望能够以 Javascript :
的形式执行
@JSExport
class Feeder {
@JSExport
def feed(feedable: Feedable): Unit = {
feedable.feed();
}
}
trait Feedable {
def feed()
}
当然不能导出特征,但我希望一种模式匹配就足够了。所以我试图用 feed
函数创建一个 Javascript 对象,但它也失败了:
var feeder = new test.Feeder();
var feedable = new function() {
this.feed = function() {
console.log('Feeding javascript');
}
}
feeder.feed(feedable);
但这引发了一个例外:
scala.scalajs.runtime.UndefinedBehaviorError: An undefined behavior was detected: [object Object] is not an instance of test.Feedable
是否有实现此行为的方法?
我不能说我 100% 确定你想要完成什么,但它 看起来 就像你试图定义 feed
来自 JavaScript 的函数。在这种情况下,您不想导出 Scala class,而是想将 Feedable 定义为外观:
trait Feedable extends js.Object {
def feed():Unit = js.native
}
这是此代码的唯一方法:
this.feed = function() {
console.log('Feeding javascript');
}
好像有点道理。
Facades 是您告诉 Scala JavaScript 代码结构的方式,这似乎是您在这里尝试做的事情。有关详细信息,请参阅 calling JavaScript from Scala 上的页面...
这里你实际上想声明 Feedable
为 JavaScript 类型,而不是 Scala 类型。所以你必须声明它扩展 js.Object
像这样:
trait Feedable extends js.Object {
def feed(): Unit = js.native
}
扩展 js.Object
将 Feedable
变成原始 JS 类型,Scala.js 编译器知道使用 JavaScript 语义而不是 Scala 语义来操作它。
我有这段代码,我希望能够以 Javascript :
的形式执行@JSExport
class Feeder {
@JSExport
def feed(feedable: Feedable): Unit = {
feedable.feed();
}
}
trait Feedable {
def feed()
}
当然不能导出特征,但我希望一种模式匹配就足够了。所以我试图用 feed
函数创建一个 Javascript 对象,但它也失败了:
var feeder = new test.Feeder();
var feedable = new function() {
this.feed = function() {
console.log('Feeding javascript');
}
}
feeder.feed(feedable);
但这引发了一个例外:
scala.scalajs.runtime.UndefinedBehaviorError: An undefined behavior was detected: [object Object] is not an instance of test.Feedable
是否有实现此行为的方法?
我不能说我 100% 确定你想要完成什么,但它 看起来 就像你试图定义 feed
来自 JavaScript 的函数。在这种情况下,您不想导出 Scala class,而是想将 Feedable 定义为外观:
trait Feedable extends js.Object {
def feed():Unit = js.native
}
这是此代码的唯一方法:
this.feed = function() {
console.log('Feeding javascript');
}
好像有点道理。
Facades 是您告诉 Scala JavaScript 代码结构的方式,这似乎是您在这里尝试做的事情。有关详细信息,请参阅 calling JavaScript from Scala 上的页面...
这里你实际上想声明 Feedable
为 JavaScript 类型,而不是 Scala 类型。所以你必须声明它扩展 js.Object
像这样:
trait Feedable extends js.Object {
def feed(): Unit = js.native
}
扩展 js.Object
将 Feedable
变成原始 JS 类型,Scala.js 编译器知道使用 JavaScript 语义而不是 Scala 语义来操作它。