【发布时间】:2014-08-19 10:08:47
【问题描述】:
如何从 Scala.js 代码调用在 Javascript 对象上定义的名为 apply() 的函数?
显而易见的解决方案不起作用,因为 apply 总是被 Scala.JS (?) 编译成对其父对象的函数调用:
var test = {
apply: function(idx) {...},
apple: function(idx) {...}
}
trait Test extends js.Object {
def apple(idx: Int) : Int = ???
def apply(idx: Int) : Int = ???
}
val test = js.Dynamic.global.test.asInstanceOf[Test]
test.apple(1) // works, of course
test.apply(1) // does not work (seems to be compiled into the call test(1) ?)
js.Dynamic.global.test.apply(1) // does not work either
【问题讨论】:
-
稍加注意,但如果可能,请避免调用函数
apply,除非您确实想覆盖默认的apply行为:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
感谢您的提示;但是,我不想在函数上调用 apply(),而是在对象上调用。
-
在 JavaScript 中,对象是一个函数。如果您不确定,弹出您最喜欢的控制台并输入
Object instanceof Function。当然,反过来也是也是正确的。期望 JavaScript 表现得像经典的面向对象语言迟早会导致混乱。 stackoverflow.com/questions/7018023/… -
好吧,当我这样做时,Chrome 中的控制台会回复“TypeError: object is not a function”:
test = { apply: function() {} }; test() -
这里
test是一个匿名对象——它确实不是一个函数——但也不能被实例化或调用,因为你已经将它声明为一个变量而不是一个对象。所以你可以调用test.apply()但 test 是变量的名称而不是类型的名称。
标签: scala.js