Scala 什么时候使用替代?

Scala 什么时候使用替代?,scala,scala.js,Scala,Scala.js,我正在试用scalajs,对于如何使用org.scalajs.DOM.html包访问DOM元素感到非常困惑。 通过反复试验,我发现有些元素需要使用asInstanceOf转换为某些类型,但有些元素不需要。关于何时何地需要使用asInstanceOf是否有一般规则 例如,假设我有一个id为myinput的input元素。为了访问输入值,我需要使用asInstanceOf: val content = document.getElementById("myinput").asInstanceOf[h

我正在试用scalajs,对于如何使用org.scalajs.DOM.html包访问DOM元素感到非常困惑。 通过反复试验,我发现有些元素需要使用
asInstanceOf
转换为某些类型,但有些元素不需要。关于何时何地需要使用
asInstanceOf
是否有一般规则

例如,假设我有一个id为
myinput
input
元素。为了访问输入值,我需要使用
asInstanceOf

val content = document.getElementById("myinput").asInstanceOf[html.Input].value
但是当需要在id
contentdiv
div
中显示
content
时,编译器没有抱怨我没有在
div
元素上使用
asInstanceOf

val mydiv = document.getElementById("contentdiv")
mydiv.innerHTML = content

另外,还有一个额外的好处,就是可以在中心位置找到所有可能的
参数的安装以及它们到实际HTML元素的映射

def getElementById(id: String): DOMElement
doElement
定义为

trait DOMElement extends js.Object {
  var innerHTML: String = js.native

  def appendChild(child: DOMElement): Unit = js.native
}
因此,无论何时调用
getElementById
都会返回一个
doElement
,您可以对其执行的唯一操作是
innerHTML
appendChild

这就是为什么上一个示例在没有显式强制转换的情况下有效

但是
DOMElement
是一种非常通用的类型。有时您知道
getElementById
将返回一个
元素

这时,您可以使用
asInstanceOf
将您拥有的额外知识告知编译器

document.getElementById("myinput").asInstanceOf[html.Input].value
                                      ^
                                      |
          hey compiler, I KNOW this is going to be an html.Input,
            please let me do my things and explode otherwise.

不用说,在使用
替代
时需要小心。如果您错了,编译器这次将无法将您从运行时崩溃中解救出来。

要回答问题的第二部分:

是否有一个中心位置可以找到所有可能的
参数的安装以及它们到实际HTML元素的映射


您可以在中搜索“extends HtmleElement”。

有趣。innerHTML和appendChild有什么特别之处,它们包含在其他不包含的地方?这两种方法是DOM元素宇宙原型链中可能最大的一组常用方法吗?不,还有很多其他的东西:这里的答案只是提到了一些东西来保持答案的简短。@sjrd感谢您的参与。快速提问,我在库中找不到实际的
domeElement
定义(我发布的定义来自reversi示例)。我错过了什么?哦,没关系,我得到了。它们都是原生js,因此它们被映射为
js.native
,包括
getElementById