2014-11-16 4 views
7
  1. Come si converte da una classe di scala in Dinamica, quindi è possibile chiamare le funzioni JavaScript non menzionate?
  2. Come si converte dalla classe dinamica a una scala?

risposta

12

Se per classe Scala si vuol dire una facciata digitato per classi JavaScript, vale a dire, una classe/tratto che si estende js.Object, allora è possibile convertire in modo semplice con asInstanceOf. Ad esempio:

val dateStatic = new js.Date 
val dateDynamic = dateStatic.asInstanceOf[js.Dynamic] 

L'altra direzione è la stessa:

val dateStaticAgain = dateDynamic.asInstanceOf[js.Date] 

.asInstanceOf[T] è sempre un no-op (cioè un getto duro) quando T estende js.Any.

Se, per classe Scala si intende una classe Scala corretta (che non è un sottotipo di js.Object), in pratica si può fare la stessa cosa. Ma solo i membri di @JSExport saranno visibili dall'interfaccia js.Dynamic. Ad esempio:

class Foo(val x: Int) { 
    def bar(): Int = x*2 
    @JSExport 
    def foobar(): Int = x+4 
} 

val foo = new Foo(5) 
val fooDynamic = foo.asInstanceOf[js.Dynamic] 
println(fooDynamic.foobar()) // OK, prints 9 
println(fooDynamic.bar()) // TypeError at runtime 
+0

Grazie per la spiegazione completa. Le conversioni funzionano. – ferk86